在C参数的宏[复制]

问题描述 投票:0回答:1

这个问题已经在这里有一个答案:

这是一个简单的程序来使用找到宏名方用一个参数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 c-preprocessor
1个回答
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);
}

如果你确实需要宏观,不要把有副作用(如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

© www.soinside.com 2019 - 2024. All rights reserved.