关于使用运算符“或”的一些细节

时间:2012-02-03 16:28:47

标签: c

考虑以下代码:

int a = 5;
if (a == 5 || a == 10)
  doSomething();

在这种情况下,a为5,因此第一个条件为真。程序是否会检查第二个条件是否为真,或者确保doSomething()确实为5后立即开始执行a

5 个答案:

答案 0 :(得分:10)

它将立即开始执行。这称为短路评估

http://en.wikipedia.org/wiki/Short-circuit_evaluation

答案 1 :(得分:4)

不会检查第二个条件。 C将逻辑评估短路,因此一旦确定了条件的真假,它就会停止。

请注意,如果代码为已发布,编译器可能甚至不会生成执行第一次比较的代码,因为它可以在编译时确定满足条件并且没有中间代码可以改变a的值。

分享并享受。

答案 2 :(得分:1)

int a = 5;
if (a == 5 || a == 10)
    doSomething();

在此示例中,||的左操作数操作数被计算为1,因此不会评估右操作数。

当左操作数被评估为||时,编译器必需不评估1运算符的右操作数。

答案 3 :(得分:1)

当涉及logical operations时,编译器会在找到表达式的真实性或错误时立即停止对表达式求值。

truth-tablelogical 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)

任何体面的编译器都不会检查第一个条件,因为在编译时它立即知道它应该调用你的方法。 (但当然所有关于短路的评论都是正确的 - 但不是这里; - )