执行速度更快,如果(c == 0& d == 0&& etc ...),或者如果(c == 0)if(d == 0)等...?

时间:2012-02-15 09:23:41

标签: performance if-statement which

我的问题是:

如果我有一个if语句,让我们说10个条件,如果我把它们全部放在一个if语句中,编译器会检查所有10个语句的条件吗?或者一旦发现一个错误的情况就会中断?

In If else执行将在发现错误条件时立即结束,例如, if(c==0 && d==4 || r ==3 && etc...)

4 个答案:

答案 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:

老实说,我甚至无法用错误的方式打扰它,因为它是如此冗长而愚蠢:)简短的回答是:它永远不会是短路之外的任何其他方式。