考虑以下代码:
int a = 5;
if (a == 5 || a == 10)
doSomething();
在这种情况下,a
为5,因此第一个条件为真。程序是否会检查第二个条件是否为真,或者确保doSomething()
确实为5后立即开始执行a
?
答案 0 :(得分:10)
它将立即开始执行。这称为短路评估。
答案 1 :(得分:4)
不会检查第二个条件。 C将逻辑评估短路,因此一旦确定了条件的真假,它就会停止。
请注意,如果代码为已发布,编译器可能甚至不会生成执行第一次比较的代码,因为它可以在编译时确定满足条件并且没有中间代码可以改变a的值。
分享并享受。
答案 2 :(得分:1)
int a = 5;
if (a == 5 || a == 10)
doSomething();
在此示例中,||
的左操作数操作数被计算为1
,因此不会评估右操作数。
当左操作数被评估为||
时,编译器必需不评估1
运算符的右操作数。
答案 3 :(得分:1)
当涉及logical operations时,编译器会在找到表达式的真实性或错误时立即停止对表达式求值。
truth-table
(logical or
)操作的||
如下:
A B A||B A&&B
0 0 0 0
0 1 1 0
1 0 1 0
1 1 1 1
因此对于像a == 5 || a == 10
这样的表达式,当a
等于5
时,当编译器看到true
部分时,表达式将被计算为a == 5
。因此,无论表达式的其余部分是评估为true
还是false
,都归因于logical or
(||
)运算符(请参阅上面的truth-table
) ,此表达式将评估为true
。因此编译器将丢弃执行表达式的其余部分。
答案 4 :(得分:1)
任何体面的编译器都不会检查第一个条件,因为在编译时它立即知道它应该调用你的方法。 (但当然所有关于短路的评论都是正确的 - 但不是这里; - )