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]实际得到评估,这可能会很危险,因为它没有首先检查'&&'左边的段错误。优先级告诉我,左侧肯定会优先,但它并没有告诉我,如果左侧为假,它将不会评估右侧。
答案 0 :(得分:46)
在C和C ++中,&&
和||
运算符“短路”。这意味着他们只在需要时评估参数。如果&&
的第一个参数为false,或者||
的第一个参数为true,则不会评估其余参数。
您发布的代码是安全的,但我质疑您为什么要包含空else
块。
答案 1 :(得分:10)
您询问&&
运算符,而不是if
语句。
&&
short-circuits,意思是如果在工作时遇到只导致一个答案的条件,它将停止工作并使用该答案。
因此,0 && x
将执行0
,然后终止,因为无论&&
的第二个参数是什么,表达式都无法计算非零值。
答案 2 :(得分:3)
答案 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衍生物。对于线程和并行处理,这是一个不同的故事;)