如何评估'if(A&& B)'语句?

时间:2009-08-25 22:11:21

标签: c++

if( (A) && (B) )
{
  //do something
}
else
  //do something else

问题是,如果A为FALSE,语句是否会立即中断。 B会被评估吗?

我问这个情况,当数组实际上是空的并且元素为零时,B检查数组索引的有效性就说array [0]。因此我们尝试访问超出数组范围的内容,因此抛出了一个段错误。具体地

if( (array.GetElements() > 0) && (array[0]))
  array[0]->doSomething();
else
  //do nothing and return

如果array [0]实际得到评估,这可能会很危险,因为它没有首先检查'&&'左边的段错误。优先级告诉我,左侧肯定会优先,但它并没有告诉我,如果左侧为假,它将不会评估右侧。

5 个答案:

答案 0 :(得分:46)

在C和C ++中,&&||运算符“短路”。这意味着他们只在需要时评估参数。如果&&的第一个参数为false,或者||的第一个参数为true,则不会评估其余参数。

您发布的代码是安全的,但我质疑您为什么要包含空else块。

答案 1 :(得分:10)

您询问&&运算符,而不是if语句。

&& short-circuits,意思是如果在工作时遇到只导致一个答案的条件,它将停止工作并使用该答案。

因此,0 && x将执行0,然后终止,因为无论&&的第二个参数是什么,表达式都无法计算非零值。

答案 2 :(得分:3)

是的,它被称为Short-circuit Evaluation

如果在声明的一部分之后可以确保布尔语句的有效性,则不评估其余部分。

当一些陈述产生副作用时,这一点非常重要。

答案 3 :(得分:0)

对于逻辑&&,两个参数都必须为true, 那么如果{}时钟将被输入,否则将执行else {}。 对于逻辑||如果{},则参数或条件之一为true即可执行。

if( (A) && (B) ){
     //if A and B both are true
}else{
}
if( (A) ||(B) ){
     //if A or B is true 
}else{
}

答案 4 :(得分:-4)

是的,如果((A)&&(B))在第一个子句上失败,如果(A)评估为假。

这适用于任何语言btw,而不仅仅是C衍生物。对于线程和并行处理,这是一个不同的故事;)