表达"值%2"和"值%2!= 0",这更有效

kin*_*ngo 0 c if-statement

int value;
Run Code Online (Sandbox Code Playgroud)
  1. if (value % 2) {...}
  2. if (value % 2 != 0) {...}

我知道第二个更容易阅读,但哪个在C,1或2中效率更高?为什么?

har*_*ald 5

它们完全相同.if语句中的任何条件都会在其为真(非零)或假(零)时进行测试,因此即使您没有将测试写为零,生成的代码也会为您进行测试.

从C11标准:

6.8.4.1 if语句:

[...]在两种形式中,如果表达式比较不等于0,则执行第一个子语句.

编辑:您还可以通过查看生成的代码为编译器验证这一点.在我的情况下(GCC 2.4.9),这两个表单都产生了这个代码:

    movl    -4(%rbp), %eax  ; Load `value` into eax
    andl    $1, %eax        ; % 2 (same as & 1)
    testl   %eax, %eax      ; is it zero?
    je  .L2                 ; yes, jump
Run Code Online (Sandbox Code Playgroud)

我编译没有优化(-O0),只是为了解决这个问题.