请给我完整的描述.... 第一段代码在增量运算符之前有“函数调用”(宏调用),第二段代码在增量运算符之后有函数调用。
-
#include <stdio.h> #define square(x) x*x int main() { int a,b=3; a=square (b)++; printf("%d%d",a,b); return 0; }
输出:
124
这里为什么返回124
-
#include <stdio.h> #define square(x) x*x int main() { int a,b=3; a=square (b++); printf("%d%d",a,b); return 0; }
输出:
125
这里是 125?
最佳答案
要记住的是,宏提供了预处理器标记的简单替换。特别是,他们可能会不止一次地评估他们的论点,如果没有括号保护,他们可能会产生意外的重新关联。
在第一个例子中,我们有
a=square (b)++;
这扩展为:
a=b*b++;
这实际上是未定义的行为,因为 b
和 b++
是无序的,而 b++
修改了 b
。在您的例子中,您看到 a
和 b
分别为 12 和 4,因此看起来 b
的第一个值正在获取增加值,所以你得到 4*3,但你不能指望这种行为。 b
的最终值为 4,因为它增加了一次。
在第二个例子中,我们有:
a=square (b++);
这扩展为:
a=b++*b++;
这又是未定义的行为。在您的情况下,您似乎得到 4*3(或 3*4),但同样,您不能指望这种行为。 b
的最终值为 5,因为它递增了两次,但这也是未定义的行为。
关于c - 为什么这两种情况下的输出不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56101861/