小姐你多风采荀慧生:C语言宏定义问题。

来源:百度文库 编辑:高考问答 时间:2024/04/20 21:18:06
这两题的结果不一样啊,请问怎么回事?大家都是x*x。
#include "stdio.h"
#include "conio.h"
#define pingfang(x) (x*x)
main()
{
int a=1;
while(a<=10)
printf("%d\t",pingfang(a++));
getch();
}
________________________________
#include "stdio.h"
#include "conio.h"
/*#define pingfang(x) (x*x)*/
main()
{
int a=1;
while(a<=10)
printf("%d\t",pingfang(a++));
getch();
}
pingfang(f)
int f;
{
return(f*f);
}

第一个程序里,定义了宏,因此,printf("%d\t",pingfang(a++)); 这句就可以等价为:printf("%d\t",a++*a++);a=1;所以第一个a++返回的值是1,之后加1,因此第二个a++返回的值为2,所以就打印出了1*2,打印出了2。再循环a=3,同样的运算过程,打印出3*4,即打印出12。等等
第二个程序里,用到函数调用,因此只有一个a++,所以每次正常的加1,输出也就是正常的1到10的平方了。
你这个问题涉及到的问题与这个类似:http://zhidao.baidu.com/question/8105507.html 都是printf语句中的变量多于一个自加的问题。

后面那个式子等于是
#define pingfang(x) ((x)*(x))
不是
#define pingfang(x) (x*x)

宏与函数不同
宏只是简单的字符串替换
#define pingfang(x) (x*x)
pingfang(a++)=
a++*a++
并不是
(a++)*(a++)