嵌套if语句和“ &&”运算符

用户名
if(a() && b() && c() && d())
   doSomething();


if(a())
   if(b()) 
      if(c())
         if(d())
            doSomething();

两者之间是否有“任何”性能差异?

例如,在a()变为0的情况下,它将在第一个if语句中继续运行b(),c()和d()吗?还是与第二个嵌套的if语句相同?

查尔斯·达菲

它们是完全相同的。

要自己进行测试,请运行gcc -S test.c(假设您已将其放置在源代码中)并观察的内容test.s


以下是if使用默认选项(带注释的注释)在gcc 4.8.1中编译嵌套方法的方式:

main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $0, %eax
    call    A                        # try to call A
    testl   %eax, %eax               # look at its return value
    je  .L3                          # short-circuit if it returned 0
    movl    $0, %eax                 # ...repeat for B, et al.
    call    B
    testl   %eax, %eax
    je  .L3
    movl    $0, %eax
    call    C
    testl   %eax, %eax
    je  .L3
    movl    $0, %eax
    call    D
    testl   %eax, %eax
    je  .L3
    movl    $0, %eax
    call    doSomething
.L3:
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc

&&方法的编译方式如下:

main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $0, %eax
    call    A                           # try to call A
    testl   %eax, %eax                  # look at its return value
    je  .L3                             # short-circuit if it returned 0
    movl    $0, %eax                    # ...repeat for B, et al.
    call    B
    testl   %eax, %eax
    je  .L3
    movl    $0, %eax
    call    C
    testl   %eax, %eax
    je  .L3
    movl    $0, %eax
    call    D
    testl   %eax, %eax
    je  .L3
    movl    $0, %eax
    call    doSomething
.L3:
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

BinaryReader和while语句运算符

来自分类Dev

if语句和“?/:”运算符之间的区别

来自分类Dev

+ !! if语句中的运算符

来自分类Dev

PHP if语句或OR运算符

来自分类Dev

重载++和+运算符

来自分类Dev

逻辑AND(&&)和OR(||)运算符

来自分类Dev

==和eq运算符

来自分类Dev

StringBuilder和'+'运算符

来自分类Dev

IfElse和OR运算符

来自分类Dev

使用or和not运算符

来自分类Dev

逻辑AND(&&)和OR(||)运算符

来自分类Dev

C ++运算符“ <”和“>”

来自分类Dev

AnsiString 和 += 运算符

来自分类Dev

运算符 = 和 != 同时

来自分类Dev

比较SIFT运算符和MOPS运算符

来自分类Dev

Java,运算符重载和String的“ +”运算符

来自分类Dev

组合问题:运算符'=='和运算符'-'

来自分类Dev

sqflite IN运算符和AND运算符

来自分类Dev

Haskell美元运算符和中缀运算符

来自分类Dev

位运算符比+和-运算符快吗

来自分类Dev

+ =运算符和新的运算符c#

来自分类Dev

逻辑运算符和增量运算符

来自分类Dev

带If语句的位运算符和比较运算符。if语句如何工作?

来自分类Dev

实现|| =和&& =运算符:没有匹配运算符声明的运算符实现

来自分类Dev

C运算符的优势:增量运算符和逻辑运算符

来自分类Dev

逻辑AND运算符与嵌套的if语句有什么区别?

来自分类Dev

Python:print()语句中的%运算符

来自分类Dev

Python If语句中的运算符

来自分类Dev

JavaScript逻辑运算符&& in语句?