我的问题是:
如果我有一个if语句,让我们说10个条件,如果我把它们全部放在一个if语句中,编译器会检查所有10个语句的条件吗?或者一旦发现一个错误的情况就会中断?
In If else执行将在发现错误条件时立即结束,例如, if(c==0 && d==4 || r ==3 && etc...)
。
答案 0 :(得分:2)
这称为短路。
在C ++中,例如,对于嵌套的&&
条件,可以保证在第一次遇到false
时检查将停止。
这当然是高度依赖语言的。
答案 1 :(得分:2)
这取决于布尔运算符&&和||是否使用短路。 在C,C ++,C#,Java等语言中就是这种情况。
短路意味着如果可以准确地确定整个布尔表达式的值,则从左到右,不评估其余表达式。
答案 2 :(得分:0)
它取决于编译器...懒惰和快捷方式
但是当你有(条件和条件......&& ......)它们中的大多数它会以第一个假结束...
所以如果条件......(条件)快于10分开......
答案 3 :(得分:0)
对于所有合理的语言/语言实现,这些应该是相同的。
正如其他人所指出的,if(a&& b&& c){code}语法是由合理的编译器优化的。
到目前为止尚未解释的是,它们的优化部分是因为编译器必须积极做错事才能使其低于优化。原因是这种“短路”通常也包含在机器代码中。您的代码将成为汇编代码:
IFNOT a, skip_code
IFNOT b, skip_code
IFNOT c, skip_code
code:
...
skip_code:
...
因此,如果检查直到一个失败,CPU将逐步执行每个操作。如果if发现一个失败,它只是跳转到最后并忽略if(...){code}块的其余部分。
注意看起来有多相似:
if (a) {
if (b) {
if (c) {
code
}
}
}
他们是一回事。任何理智的编译器都会确保它们是相同的。
要做到这一点没有短路,编译器编写者必须主动选择类似的东西:
SET badForCodeRun,False
IF a, skipA
SET badForCodeRun, True
GOTO skipCode
skipA:
IF b, skipB
SET badForCodeRun, True
...
skipCode:
老实说,我甚至无法用错误的方式打扰它,因为它是如此冗长而愚蠢:)简短的回答是:它永远不会是短路之外的任何其他方式。