C语言宏定义小程序问题
[code=C/C++][/code]
#define M 3
#define N M+1
#define S N*N/2
main()
{
printf("S=%d\n",S);
printf("5*S=%d\n",5*S);
}
今早在课本上看到上面这一段代码,可是为什么它的运行结果会是:S=6 5*S=18 ,
而不是S=3+1*3+1/2=6.5 5*S=5*3+1*3+1/2=18.5 呢?
[解决办法]
替换后为
S=3+1*3+1/2
所以S=6;
[解决办法]
#define N (M+1)
就没有问题了,C++ primer上好像降到了define这种需要注意的问题。都是直接替换的
[解决办法]
1/2是0
[解决办法]
宏的本质就是字符串替换
原封不动的去替换
#define M 3
#define N M+1
#define S N*N/2
那么S 替换的是M+1*M+1/2 即 3+1*3+1/2 = 6
5*S 替换以后是 5*M+1*M+1/2 即 5*3+1*3+1/2 = 18
[解决办法]
1/2默认是按照整型处理的
如果换为
1/2.0 就等于0.5
[解决办法]
整形没有小数,只舍不入
[解决办法]
是你在定义宏的时间出现的 "宏的副作用"导致的出现的问题,在定义的时间一定要记住你所定义的是一个整体,他们是不能分开的,如果没有限制好,那么就会出现类似的副作用.
[解决办法]
编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。