【问题标题】:How does the increment operator work in an if statement?递增运算符如何在 if 语句中工作?
【发布时间】:2025-12-22 15:40:16
【问题描述】:
    #include <stdio.h>

    int main()
    {
        int x = 0;

        if (x++)
            printf("true\n");
        else if (x == 1)
            printf("false\n");
        return 0;
    }

输出:

false

为什么输出是假的?

x++ 是后增量;这意味着使用x 的值,然后递增。 如果是这样,那么应该使用x=0,答案应该是正确的。

【问题讨论】:

  • 因为试试++x你就知道了。
  • 有一次,这被标记为 Post-increment operator behaviour 的副本,但是(正如我在 2014 年 4 月在我已删除的评论中指出的那样),副本的内容是关于未定义的行为在函数调用的两个参数中同时使用i++i — 因此,这不是一个很好的匹配或这个问题(即使标题是一个很好的匹配)。此问题没有未定义的行为。

标签: c if-statement post-increment


【解决方案1】:

我的观点是,为了更好地响应“if”语句和后自增运算符“++”之间的关系,需要将 C 代码扩展为汇编。 试图在高级语言的“if ... else”语句块的限制逻辑下弄清楚它可能会产生误导,因为流控制是用不同的术语来理解的。

考虑到 pre 和 post 操作符依赖于“change-then-use”和 分别使用“use-then-change”规则,其中“change”表示“increment”,“use”表示“comparison”。 所以你输入的 C 代码基本上变成了这个原始的伪程序集:

; evaluating the first condition
mov x,0 // set x = 0
cmp x,0 // use (for comparison)
inc x // then change (now x is 1)
je print1
; evaluating the second condition
mov eax,1
cmp eax,x // evaluates to true
je print2

print1:
   printf("true\n");

print2:
  printf("false\n");

请注意,编译器可能不会将 inc 指令放在相同的位置,即标记的指令块的顶部或底部。 希望对您有所帮助!

【讨论】:

    【解决方案2】:

    我相信这可以解决错误

    
    #include <stdio.h>
    
        int main()
        {
            int x = 0;
    
            if (++x)
                printf("true\n");
            else if (x == 1)
                printf("false\n");
            return 0;
        }
    

    【讨论】:

      【解决方案3】:

      0 等效于 C 中的 false。由于您使用的是后增量运算符,因此在增量之前评估条件,因此 x 为 false 并且永远不会执行 printf("true\n");。然后转到 else 并成功评估 x == 1,然后打印 false。

      作为一种好的做法,尽量避免在条件句中进行赋值。

      【讨论】:

        【解决方案4】:

        您自己写道:“x++ 是后自增,这意味着使用 x 的值然后自增

        考虑一下这意味着什么:

        1. x 是0

        2. 表达式被求值,0为假,所以表达式为假。

        3. post 增量发生,将 x 从 0 更改为 1
          (在计算表达式后)

        【讨论】:

          【解决方案5】:

          在 C 中,0 被视为false。在x++中,x的值,即0在表达式中使用,它变成了

          if(0)  // It is false
              printf("true\n");  
          

          if 的主体不会被执行。之后x 现在是1。现在检查else if 中的条件,即x == 1。因为 x1 ,所以这个条件的计算结果是 true ,因此它的主体被执行并打印 "false"

          【讨论】:

            【解决方案6】:

            0 在 C 中为 false。您正在使用 post-increment 运算符。

            【讨论】:

              【解决方案7】:

              后增量意味着它返回当前值(在这种情况下是为了if)并在之后增加它。相当于

              if(x) {
                x++;
                // ...
              } else {
                x++;
                // ...
              }
              

              【讨论】: