2011-02-26 12 views
6
#include<stdio.h> 
#include<conio.h> 
#define PROD(x) (x*x) 
void main() 
{ 
clrscr(); 
int p=3,k; 
k=PROD(p+1); //here i think value 3+1=4 would be passed to macro 
printf("\n%d",k); 
getch(); 
} 

En mi opinión, la salida debe ser 16, pero obtengo 7.La salida del programa C es confusa

¿Alguien puede decirme por qué?

+5

Ejemplo de libro escolar donde las macros C salen mal :) Use las funciones en su lugar. –

+4

¿No es esta la * primera * cosa que advierten en cualquier libro de programación de C? Lo que sea que uses, estoy seguro de que puedes encontrar uno mejor. –

+4

Urgh, a 'void main()' ... –

Respuesta

5

El preprocesador expande PROD (p + 1) de la siguiente manera:

k = (p+1*p+1); 

con P = 3, esto da: 3 + 1 * 3 + 1 = 7.

Debería haber escrito su #define de la siguiente manera:

#define PROD(x) ((x)*(x)) 
2
#define PROD(x) (x*x) 

PROD(3+1) es cambiado por el preprocesador para 3+1*3+1

21

macros son ampliado, que no tienen valores pasaron a ellos. Mira a qué se extiende tu macro en la declaración que asigna al k.

k=(p+1*p+1); 

Prefiero funciones de macros, si usted tiene que utilizar una macro el mínimo que debe hacer es parenthesise totalmente los parámetros. Tenga en cuenta que incluso esto tiene posibles sorpresas si los usuarios lo usan con expresiones que tienen efectos secundarios.

#define PROD(x) ((x)*(x)) 
2

macro no son función. Estos son reemplazadas por nombre

Será p+1*p+1

5

El problema aquí es que PROD es una macro y no se comportará exactamente como lo quiere instalar. Por lo tanto, se verá así:

k = p+1*p+1 

Lo que por supuesto significa que tiene:

k = 3+1*3+1 = 7 
2

Esto es lo que el compilador verá después de que los preprocesadores hagan su trabajo: k = p + 1 * p + 1. Cuando p = 3, esto se evalúa como k = 3+ (1 * 3) +1. Por lo tanto 7.

1

Esto es exactamente por qué debería utilizar funciones en lugar de macros. Una función solo evalúa cada parámetro una vez. ¿Por qué no probar

int prod (int x)
{return x * x; }

y ver la diferencia!

Cuestiones relacionadas