我应该删除`else if`中不必要的`else`吗?

Xiè*_*léi 1 c

比较两者:

if (strstr(a, "earth"))     // A1
    return x;
if (strstr(a, "ear"))       // A2
    return y;
Run Code Online (Sandbox Code Playgroud)

if (strstr(a, "earth"))     // B1
    return x;
else if (strstr(a, "ear"))  // B2
    return y;
Run Code Online (Sandbox Code Playgroud)

就个人而言,我觉得这else是多余的,并阻止CPU进行分支预测.

在第一个中,当执行A1时,可以预解码A2.在第二个中,它将不会解释B2,直到B1被评估为假.

我发现使用后一种形式的很多(可能是大多数?)来源.虽然,后一种形式看起来更好理解,因为它不会明显return y只有在a =~ /ear(?!th)/没有else子句的情况下才会调用.

Gre*_*ill 6

您的编译器可能知道这两个示例的含义完全相同.CPU分支预测没有进入它.

我通常会选择第一个对称选项.

  • @谢继雷'Lenik,这是无关紧要的.编译器知道只有当它是假的时才能超过第一个条件,否则返回将被执行,所以无论你在条件中写什么,无论如何都暗示其他条件.我刚刚用GCC对它进行了测试,即使没有优化,它也会为两种情况生成相同的代码. (2认同)
  • @谢继雷'Lenik,现在这两个意味着不同的东西.如果`a`是"earth",则在第一种情况下将执行foo()和bar(),而在第二种情况下,只有foo()将执行. (2认同)