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

前端之家收集整理的这篇文章主要介绍了c – 嵌套if语句和“\u0026\u0026”运算符前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. if(a() && b() && c() && d())
  2. doSomething();
  3.  
  4.  
  5. if(a())
  6. if(b())
  7. if(c())
  8. if(d())
  9. doSomething();

这两者之间是否存在“任何”性能差异?

例如,在a()变为0的情况下,它是否会在第一个if语句中继续运行b(),c()和d()?或者它会与第二个嵌套的if语句一样工作吗?

解决方法

它们完全相同.

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

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

  1. main:
  2. .LFB0:
  3. .cfi_startproc
  4. pushq %rbp
  5. .cfi_def_cfa_offset 16
  6. .cfi_offset 6,-16
  7. movq %rsp,%rbp
  8. .cfi_def_cfa_register 6
  9. movl $0,%eax
  10. call A # try to call A
  11. testl %eax,%eax # look at its return value
  12. je .L3 # short-circuit if it returned 0
  13. movl $0,%eax # ...repeat for B,et al.
  14. call B
  15. testl %eax,%eax
  16. je .L3
  17. movl $0,%eax
  18. call C
  19. testl %eax,%eax
  20. call D
  21. testl %eax,%eax
  22. call doSomething
  23. .L3:
  24. popq %rbp
  25. .cfi_def_cfa 7,8
  26. ret
  27. .cfi_endproc

这是和&&方法编译:

  1. main:
  2. .LFB0:
  3. .cfi_startproc
  4. pushq %rbp
  5. .cfi_def_cfa_offset 16
  6. .cfi_offset 6,%eax
  7. call A # try to call A
  8. testl %eax,%eax # look at its return value
  9. je .L3 # short-circuit if it returned 0
  10. movl $0,%eax # ...repeat for B,8
  11. ret
  12. .cfi_endproc

猜你在找的C&C++相关文章