在C中带有参数的宏

时间:2019-02-03 06:38:47

标签: c c-preprocessor

这是一个简单的程序,可使用带有参数x的宏名称SQUARE查找数字的平方。我对i,j的输出感到满意,但是 其他变量的输出是意外的,因为k,m是质数,l,n的值也不匹配我预测的输出。请同样提供帮助。 预先谢谢你。

  

Output Screen Image Link

#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);
}

1 个答案:

答案 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);

实际上,如上所述,对于bik,您不需要m,因为用于分配给这三个变量的表达式不需要不会带来副作用。您需要b,但是需要jln