且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

嵌套if语句和“&&”操作者

更新时间:2023-02-17 10:26:41

它们完全相同。

要自己测试一下,运行 gcc -S test.c (假设这是您放置源代码的地方)并观察内容 test.s

To test this yourself, run gcc -S test.c (presuming that this is where you've put your source) and observe the contents of test.s.

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

Here's how the nested-if approach compiles in gcc 4.8.1 with default options (annotated with comments):

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

以下是&& 方法的编制方式:

Here's how the && approach compiles:

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