Performance 如果(c==0&;d==0&;等等),或者如果(c==0)如果(d==0)等等,执行哪个更快。。。?

Performance 如果(c==0&;d==0&;等等),或者如果(c==0)如果(d==0)等等,执行哪个更快。。。?,performance,if-statement,Performance,If Statement,我的问题是: 如果我有一个包含10个条件的if语句,如果我把它们都放在一个if语句中,编译器会检查所有10个语句的条件吗?或者一旦发现一个错误的条件它就会崩溃 在If-else中,一旦发现错误条件,执行将立即结束,例如If(c==0&&d==4 | | r==3&&etch…)这称为短路 在C++中,例如,对于嵌套的和< /代码>条件,保证在第一次遇到的错误< /代码>下停止检查。 这当然是高度依赖于语言的。这被称为短路 在C++中,例如,对于嵌套的和< /代码>条件,保证在第一次遇到的错误<

我的问题是:

如果我有一个包含10个条件的if语句,如果我把它们都放在一个if语句中,编译器会检查所有10个语句的条件吗?或者一旦发现一个错误的条件它就会崩溃


在If-else中,一旦发现错误条件,执行将立即结束,例如
If(c==0&&d==4 | | r==3&&etch…)
这称为短路

在C++中,例如,对于嵌套的<代码>和< /代码>条件,保证在第一次遇到的<代码>错误< /代码>下停止检查。
这当然是高度依赖于语言的。

这被称为短路

在C++中,例如,对于嵌套的<代码>和< /代码>条件,保证在第一次遇到的<代码>错误< /代码>下停止检查。
这当然高度依赖于语言。

这取决于布尔运算符&&和| |是否使用短路。 在C语言、C++语言、C语言、java语言中,就是这样。
短路意味着,如果整个布尔表达式的值可以准确地从左到右取消确定,那么其余的表达式将不会计算。

这取决于布尔运算符&&和| |是否使用短路。 在C语言、C++语言、C语言、java语言中,就是这样。
短路意味着,如果整个布尔表达式的值可以准确地从左到右取消确定,那么其余的表达式将不会计算。

这取决于编译器。。。懒惰和捷径

但大多数情况下,当你有(条件&&condition..&&…)时,它会在第一个错误处结束


所以如果(条件)比10个独立的if条件快…

这取决于编译器。。。懒惰和捷径

但大多数情况下,当你有(条件&&condition..&&…)时,它会在第一个错误处结束


因此,对于所有合理的语言/语言实现,如果(条件)快于10个独立的if条件,那么它们应该是相同的

正如其他人指出的,if(a&&b&&c){code}语法是由合理的编译器优化的

到目前为止还没有解释的是,它们被优化了,部分原因是编译器必须积极地做错误的事情,以使其不那么优化。原因是这种“短路”通常也内置在机器代码中。您的代码将变成汇编代码,类似于:

IFNOT a, skip_code
IFNOT b, skip_code
IFNOT c, skip_code

code:
   ...

skip_code:
   ...
SET badForCodeRun,False

IF a, skipA
SET badForCodeRun, True
GOTO skipCode

skipA:

IF b, skipB
SET badForCodeRun, True
...

skipCode:
因此CPU将逐步执行这些if检查,直到其中一个失败。如果If发现一个失败,它只会跳到末尾并忽略If(…){code}块的其余部分

请注意,这与:

if (a) {
   if (b) {
       if (c) {
           code
       }
   }
}
它们是一样的。任何理智的编译器都会确保它们是相同的

要在不发生短路的情况下执行此操作,编译器编写器必须主动选择以下内容:

IFNOT a, skip_code
IFNOT b, skip_code
IFNOT c, skip_code

code:
   ...

skip_code:
   ...
SET badForCodeRun,False

IF a, skipA
SET badForCodeRun, True
GOTO skipCode

skipA:

IF b, skipB
SET badForCodeRun, True
...

skipCode:

老实说,我甚至都不介意用错误的方式输入,因为它太冗长和愚蠢了:)简单的回答是:除了短路以外,再也不会有其他方式了。

对于所有合理的语言/语言实现,这些都应该是相同的

正如其他人指出的,if(a&&b&&c){code}语法是由合理的编译器优化的

到目前为止还没有解释的是,它们被优化了,部分原因是编译器必须积极地做错误的事情,以使其不那么优化。原因是这种“短路”通常也内置在机器代码中。您的代码将变成汇编代码,类似于:

IFNOT a, skip_code
IFNOT b, skip_code
IFNOT c, skip_code

code:
   ...

skip_code:
   ...
SET badForCodeRun,False

IF a, skipA
SET badForCodeRun, True
GOTO skipCode

skipA:

IF b, skipB
SET badForCodeRun, True
...

skipCode:
因此CPU将逐步执行这些if检查,直到其中一个失败。如果If发现一个失败,它只会跳到末尾并忽略If(…){code}块的其余部分

请注意,这与:

if (a) {
   if (b) {
       if (c) {
           code
       }
   }
}
它们是一样的。任何理智的编译器都会确保它们是相同的

要在不发生短路的情况下执行此操作,编译器编写器必须主动选择以下内容:

IFNOT a, skip_code
IFNOT b, skip_code
IFNOT c, skip_code

code:
   ...

skip_code:
   ...
SET badForCodeRun,False

IF a, skipA
SET badForCodeRun, True
GOTO skipCode

skipA:

IF b, skipB
SET badForCodeRun, True
...

skipCode:

老实说,我甚至都懒得用错误的方式输入它,因为它太冗长和愚蠢了:)简短的回答是:除了短路,它永远不会是其他任何方式。

if(c==0&&d==0)
在逻辑上并不等同于
if(c==0)或者if(d==0)
。很抱歉,我的意思是如果(c==0&&d==0),如果(c==0)如果(d==0)
if(c==0&&d==0)
在逻辑上并不等同于
if(c==0)或者if(d==0)
。它们并不代表相同的控制流。很抱歉,我的意思是如果(c==0&&d==0),如果(c==0)如果(d==0),那么如果语言有短路功能,使用布尔运算符还是不使用它们,哪一个会更快?编译器可以随心所欲地编译它们,包括忽略程序集级别的快捷方式行为,如果它生成的代码的行为就好像它是按照语义编译的一样。查看程序集在何处计算谓词中的所有术语,即使它一看到假值就可以进行快捷操作。OP的问题没有副作用,因此这种优化是可能的。因此,如果语言具有短路功能,使用布尔运算符或不使用布尔运算符,哪一种会更快?编译器可以随心所欲地编译它们,包括忽略程序集级别的快捷方式行为,如果它生成的代码的行为就好像它是按照语义编译的一样。查看程序集在何处计算谓词中的所有术语,即使它一看到假值就可以进行快捷操作。OP的问题没有副作用,所以这种优化是可能的。这不取决于编译器,而是取决于语言。例如,在C语言中,所有的编译器都必须简化&&和| |运算符OK,这取决于语言标准。但我仍然可以编写自己的编译器,直到