c - 无法理解 C 程序的输出

标签 c postfix-operator

编辑:这个问题不是重复的,因为在这种情况下行为不是未定义的。

为什么下面的程序在第一行打印输出为 231?

对此我有两个疑惑:

  1. 因为我正在做后缀递增,所以在我调用 max 函数之前 x 的值不应该增加。所以根据我的说法,输出应该首先是 1 而不是 2 。我错过了什么?

    #define prn(a) printf("%d",a)
    #define print(a,b,c) prn(a), prn(b), prn(c)
    #define max(a,b)  (a<b)? b:a
    
    main()
    {
        int x=1, y=1;
        print(max(x++,y),x,y);
        printf("\n");
        print(max(x++,y),x,y);
    }
    

    输出:

    231
    451
    
  2. 后缀操作发生在语句执行之后?考虑以下示例。

    int main()
    {
        int x = 0, y = 1;
        int a = x++ /*x is incremented hereafter?*/+ y;             // line 1
        /* Or x is incremented now after execution of above line?*/ // line 2
        int b = 0;
    }
    

最佳答案

让我走这条线

               print(max(x++,y),x,y);

需要注意的重要一点是,C 预处理器是一个宏预处理器(允许您定义宏),它在编译之前转换您的程序。这些转换可以包括头文件、宏扩展等。

所有预处理指令都以# 符号开头。例如,

                #define PI 3.14

告诉编译器在它看到的地方用 3.14 替换值 PI。

           c source code->preprocessor->compiler

因此 print(max(x++,y),x,y) 在宏中扩展为

           1.      prn((x++<y) ? y:x++), prn(x), prn(y) 

        2. printf("%d",(x++<y)? y:x++), printf("%d",x), printf("%d",y);.

在这里它得到处理你可以在这里仔细检查两件事

检查时

               x++<y ,the x++ value is 1

然后x值变为2

所以打印了2

然后在打印时我们也写了 x++ 这意味着这里 x++ VALUE IS 2 但是

之后x值为3

所以 3 被打印出来,它作为 1 在 y 之后

原来是这样

2.让你对前置增量和后置增量有一个很好的直觉

举个例子

               int x=2;//value of x is 2

               x++;//here x++ value is 2

此行执行后 x 值变为 3

               ++x//here x++ value is 4 and also x value is 4.

关于c - 无法理解 C 程序的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52789525/

相关文章:

c - Postfix++ 运算符在 While 条件下未按预期运行

服务器可以使用相同的套接字将响应发送给客户端吗?如何?

c - 如何在C中使用一条printf语句多次打印变量

c++ - 前缀递增运算符错误 C++

javascript - 通过前缀和后缀运算符递增数字

c++ - 重载 "operator++"返回非常量,并且 clang-tidy 提示

c - 以编程方式访问核心文件内存镜像

c - 在 typedef 结构中声明的 Malloc char 数组

C - 在word中搜索一个字母

c++ - C++ 编译器是否将所有后缀运算符重载视为相同(- 和 -- 的后缀版本)?