c – 嵌套if语句和“\u0026\u0026”运算符

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
    call    D
    testl   %eax,%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,%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,8
    ret
    .cfi_endproc

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...