Nested if statements and the && operator

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

Is there any “performance difference” between the two?

For example, in a situation where a () turns 0, will it continue to work b (), c () and d () in the first case of if? Or will it work just like the second nested if statement?

+5
source share
1 answer

They are exactly identical.

To test this yourself, run gcc -S test.c (suppose this is where you put your source) and watch the contents of test.s


Here's how the nested- if approach compiles in gcc 4.8.1 with default parameters (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 
+9
source

Source: https://habr.com/ru/post/1201029/


All Articles