【问题标题】: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,答案应该是正确的。
【问题讨论】:
-
-
有一次,这被标记为 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 的值然后自增”
考虑一下这意味着什么:
x 是0
表达式被求值,0为假,所以表达式为假。
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。因为 x 是 1 ,所以这个条件的计算结果是 true ,因此它的主体被执行并打印 "false"。
【解决方案6】:
0 在 C 中为 false。您正在使用 post-increment 运算符。
【解决方案7】:
后增量意味着它返回当前值(在这种情况下是为了if)并在之后增加它。相当于
if(x) {
x++;
// ...
} else {
x++;
// ...
}