c - 为什么这两种情况下的输出不同

标签 c

请给我完整的描述.... 第一段代码在增量运算符之前有“函数调用”(宏调用),第二段代码在增量运算符之后有函数调用。

  1. #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

  2. #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++;

这实际上是未定义的行为,因为 bb++ 是无序的,而 b++ 修改了 b。在您的例子中,您看到 ab 分别为 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/

相关文章:

c - 如何使用perf分析C项目代码?

c - 可变参数宏不起作用

c - 静态的生命周期真的在程序执行时开始吗?

c - 初始化结构中的指针数组时是否需要花括号?

c - 数据链路套接字读取传出数据包?

c - C语言中单个竖线是什么意思

C程序删除字符串中所有不必要的空格

c - 蒙蒂霍尔游戏: How to allow user to choose door instead of program automatically randomizing choice?

c - 为什么我收到错误 "cannot find -lncurses"?

c - 我在实现堆栈时遇到问题