sqr不是函数,是常值
代码只会将所有sqr(i)形式做字符串替换,它不会自动将3+1的结果当做i
而是替换成这样的形式
3+1*3+1
你改一下,像这样
sqr(i) (i)*(i)
就对了
因为你很呆
定义宏后,是在预编译阶段将代码里用了宏的地方替换成宏的定义,在预编译阶段是不执行代码的,预编译过后才会执行;在这里就是将所有sqr(i)替换为i*i,再执行。
也就是说,在你sqr(a+b)后,根据你的定义,在预编译阶段会将sqr(a+b)替换为a+b*a+b,而不是执行a+b后再用算出来的结果替换,因为在预编译阶段是不会执行代码的。所以一般像这样使用宏的时候要用括号括起来,程序才能在执行的时候知道计算的优先级:#define sqr(a) ((a)*(a)) 。
注意,#define sqr(a) (a)*(a) 也可能在执行时出现问题,比如说 int c = b/sqr(a); 在预编译阶段替换后会变成 int c = b/a*a; 然后从左到右计算,算出来的结果显然会与想要的 int c = b/(a*a); 不同。