这个问题已经在这里有一个答案:
这是一个简单的程序来使用找到宏名方用一个参数x一个数的平方。我很舒服I,J,但其他变量的输出是出人意料的,因为K,M的输出是素数也升了值,n不,我预测的输出相匹配。对于同一请帮助。先感谢您。
#include <stdio.h>
#define SQUARE(x) (x * x)
void main() {
int a = 3;
int i, j, k, l, m, n;
i = SQUARE(a);
j = SQUARE(a++);
k = SQUARE(a + 1);
l = SQUARE(++a);
m = SQUARE(a + 2);
n = SQUARE(a++);
printf("\n i= %d", i);
printf("\n j= %d", j);
printf("\n k= %d", k);
printf("\n l= %d", l);
printf("\n m= %d", m);
printf("\n n= %d", n);
}
C代码宏做纯文本替换,所以SQUARE(a++)
直接与在预处理阶段(a++ * a++)
取代,这就是为什么你得到错误的结果。
见gcc -E <your code>
的(部分)输出,你就会知道为什么:
void main() {
int a = 3;
int i, j, k, l, m, n;
i = (a * a);
j = (a++ * a++);
k = (a + 1 * a + 1);
l = (++a * ++a);
m = (a + 2 * a + 2);
n = (a++ * a++);
printf("\n i= %d", i);
printf("\n j= %d", j);
printf("\n k= %d", k);
printf("\n l= %d", l);
printf("\n m= %d", m);
printf("\n n= %d", n);
}
如果你确实需要宏观,不要把有副作用(如a++
)在宏“调用”任何表情,也围绕“变量”用一对额外的括号:
#define SQUARE(x) ((x) * (x))
int a = 3, b;
...
b = a;
i = SQUARE(b);
b = a++;
j = SQUARE(b);
b = a + 1;
k = SQUARE(b);
b = ++a;
l = SQUARE(b);
b = a + 2;
m = SQUARE(b);
b = a++;
n = SQUARE(b);
事实上,就像上面说,你不需要为b
,i
和k
m
,作为表达式使用来分配这三个变量不引入副作用。你需要b
,然而,与j
,l
和n
。