#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
,答案应该是真的。
答案 0 :(得分:7)
在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"
。
答案 1 :(得分:3)
后增量意味着它返回当前值(在本例中为if
的目的)并在之后递增。它相当于
if(x) {
x++;
// ...
} else {
x++;
// ...
}
答案 2 :(得分:2)
0
在C中等于false。当您使用post-increment运算符时,在递增之前计算条件,因此x为false且永远不会执行printf("true\n");
。然后转到else
并成功评估x == 1
,然后输出false。
作为一种好的做法,尽量避免在条件句中进行分配。
答案 3 :(得分:1)
0为假。您正在使用后增量运算符。
答案 4 :(得分:1)
你自己写道:“ x ++是后增量,这意味着使用x的值然后增加”
考虑一下这意味着什么:
x是0
评估表达式,0表示false,因此表达式为false。
帖子 增量发生,将x从0
更改为1
。
(表达评估后)
答案 5 :(得分:0)
我相信这完全可以解决错误
signer, signrand
____________________________________________
MICHAEL MCLEAN BARRY NEVILLE PITT
BARRY NEVILLE PITT BARRY NEVILLE PITT
GREGORY DONALD MILNE BARRY NEVILLE PITT
GREGORY DONALD MILNE BARRY NEVILLE PITT
GREGORY DONALD MILNE BARRY NEVILLE PITT
BARRY NEVILLE PITT BARRY NEVILLE PITT
答案 6 :(得分:0)
我的观点是,要更好地响应'if'语句和后递增运算符'++'之间的关系,需要将C代码扩展为Assembly。 试图在高级语言“ if ... else”语句的块的约束逻辑下弄清楚这一点,可能会产生误导,因为流控制是用不同的术语读取的。
请考虑前置和后置运算符依赖于“先更改后使用”以及 “使用然后更改”规则,其中“更改”是指“增量”,“使用”是“比较”。 因此,您输入的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指令放在相同的位置,即标记的指令块的顶部或底部。 希望对您有帮助!