牧业公司宣传片:C语言问题呀

来源:百度文库 编辑:高校问答 时间:2024/04/27 18:11:37
#define M 3
#define N (M+1)
#define NN N*N/2
main()
{
clrscr();
printf("NN=%d,",NN);
printf("5*NN=%d\n",5*NN);
}

中结果:NN=8,5*NN=40

【讨论】
如果第二行改为:
#define N M+1

结果: NN=6,5*NN=18

后面是为什么?

在c语言中见到宏系统只是替换,而不给于计算,所以就有你的这种情况.
第一中情况:系统是这样执行的:NN=(3+1)*(3+1)/2=8
第二种情况:NN=3+1*3+1/2=3+3+0=6
所以是你的答案了.
所以在编写宏时,一定要加上括号,切记,切记^^^^^^^

在c语言中见到宏系统只是替换,而不给于计算,所以就有你的这种情况.
第一中情况:系统是这样执行的:NN=(3+1)*(3+1)/2=8
第二种情况:NN=3+1*3+1/2=3+3+0=6
所以是你的答案了.
所以在编写宏时,一定要加上括号,切记,切记^^^^^^^

所以像这样的定义要特别小心,如果没加什么括号什么的,就会有想不到的结果出来.

经过编译替换:
5*NN -> 5*N*N/2 -> 5* M+1 * M+1 /2
注意,没有括号,所以也就是等于
5*3 + 1*3 + 1/2 = 15 + 3 + 0 = 18

它就是直接换那段M+1~