为什么这段代码总是产生x=2
?
unsigned int x = 0;
x++ || x++ || x++ || x++ || ........;
printf("%d\n",x);
为什么这段代码总是产生x=2
?
unsigned int x = 0;
x++ || x++ || x++ || x++ || ........;
printf("%d\n",x);
第一个x++
将 x 更改为 1 并返回 0
第二个x++
将 x 更改为 2 并返回 1
此时 or 短路,返回 true,并使 x 为 2。
x++ || x++ || x++ || x++ || …………;
||
短路。从左开始求值,当找到真值(非零)时,它停止求值,因为表达式现在为真,再也不会为假。
首先x++
评估为 0(因为它是后增量),其次评估为 1,这是正确的,并且很快,你就完成了!
当您评估“a || b || c || d || e || ...”时,您可以在找到的第一个非零值处停止评估。
第一个“x++”计算为 0,并将 x 递增到 1,然后继续计算表达式。第二个 x++ 被评估为 1,将 x 增加到 2,此时,您无需查看 OR 语句的其余部分即可知道它将为真,因此您停止。
因为当找到真值时逻辑或短路。
所以第一个 x++ 返回 0(假),因为它是后增量。(x = 1) 第二个 x++ 返回 1 (true) - 短路。(x = 2)
打印 x = 2;
因为早期的比较评估。
这相当于
0++ | 1++
编译器在 x==1 时立即退出比较,然后发布增量,使 x==2
因为第一个“x++ || x++”的计算结果为“真”(意味着它不为零,因为“0 || 1”为真。由于它们都是逻辑或运算符,其余的或运算将被忽略。
麦克风
运算符计算||
左侧表达式,如果为 0(假),则计算右侧表达式。如果左侧不为 0,则根本不会评估右侧。
在表达式x++ || x++ || x++ || ...
中,第一个x++
被评估;它评估为 0,x 递增到 1。第二个x++
被评估;它的计算结果为 1,x 增加为 2。由于第二个x++
计算结果为非零值,因此不会计算剩余的x++
表达式。
尝试替换||
为|
.--
这是逻辑运算符的短路。
当你这样做的时候也是一样的原因
if (returns_true() || returns_true()){ }
returns_true
只会被调用一次。