我遇到了这个问题。
#include <stdio.h>
int main()
{
int k=8;
int x=0==1||k++;
printf("%d %d",x,k);
return 0;
}
输出为1 9
。
正如answer所暗示的那样
与按位|不同运算符,||运营商保证从左到右的评估;在评估第一个操作数后有一个序列点。如果第一个操作数比较不等于0,则不计算第二个操作数。
我无法理解如何评估语句int x=0==1||k++
,因为x和k的值分别变为1,9。
有人可以解释c中编译器如何评估这些语句吗?
答案 0 :(得分:5)
&#34;与按位|不同运算符,||运营商保证从左到右的评估;在评估第一个操作数后有一个序列点。如果第一个操作数将不等于0,则不评估第二个操作数。&#34;
是的,这是真的......
明确 首先确保了解这些基本知识
1)(1 || any_var)为1
2)运算符优先级如下
++
然后
==
然后
||
现在让您怀疑 || vs |
请注意 | (单管)操作符..,无论如何都将执行LHS和RHS
,而
|| (双管)评估||的LHS首先,如果是1则不需要评估RHS(速度)
||的RHS如果LHS真实,则不会对运营商进行评估。
但此处0 == 1为假,即0 == 1返回0
因此 RHS将被证实
所以声明
执行k ++
但使用了8(作为后增量运算符的属性表示 - &gt;首先使用然后增量)
所以0 || 8绝对是真的(1)所以x的计算结果为1
和然后k在序列点后递增,即k等于9
因此输出x = 1且k = 9
我希望它能清除你的怀疑:)。
答案 1 :(得分:1)
运营商|| (OR)在案例中评估为真:
ex:A ||乙
因为如果A被评估为真,则此操作使用Short-Circuit Evaluation,这意味着该语句已经为真,并且它不会评估B.
在你的情况下,0 == 1(0等于1)显然是假的,所以它将评估k ++。 k ++是一个棘手的(在我看来)。在C世界中,真/假评估是基于0或不是(除了时间错误意味着小于0 ...)但是在真/假评估中0是假的,其他一切都是真的。
K ++意味着评估K然后递增,所以,如果K为0则为假并变为1,如果是其他任何东西,则为真然后增量。
在你的情况下k == 8所以k ++的结果为TRUE,k将变为9.K为真意味着x评估结果为TRUE(它为FALSE或TRUE)。
因此输出为1(真)9(8 ++)
答案 2 :(得分:1)
0==1||k++
为1,因为表达式:1
结果为真(在C land中为0 == 1
)。你为什么问?这里有两个序列点:k++
和0
。由于第一个序列点的计算结果为false(C land中为||
),因此评估第二个序列点(因为短路运算符为1
)。第二个序列返回true(或0 || 1
)。所以,你将整个表达式分解为:x
。因此1
为k
。
9
; , k++
为C
HTH。