这是一个简单的程序,可使用带有参数x的宏名称SQUARE查找数字的平方。我对i,j的输出感到满意,但是 其他变量的输出是意外的,因为k,m是质数,l,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);
}
答案 0 :(得分:2)
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);
}
如果您确实需要宏,请不要在宏“ call”中放置任何有副作用(例如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
。