不同的条件检查方式

时间:2014-01-17 01:53:15

标签: c++ conditional-statements conditional-operator

要检查范围int内的[1, ∞),我可以使用以下方式(使用#1,#2):

  1. if (a>=1)
  2. if (a>0)
  3. if (a>1 || a==1)
  4. if (a==1 || a>1)
  5. 四个版本中我应该注意哪些不同?

4 个答案:

答案 0 :(得分:3)

从功能上讲,您列出的4种方式没有区别。这主要是风格问题。我敢说,#1和#2是最常见的形式,如果我在代码审查中看到#3或#4,我会建议改变。

Perf明智地我认为有些编译器可能优于其他编译器。但我真的怀疑它。充其量只是一个微优化,如果没有直接的探查器输入,我将永远不会以编码风格为基础

答案 1 :(得分:1)

我真的不明白为什么要使用3或4.除了输入更长时间外,它们还会生成更多代码。因为在or条件下,如果第一个为真,则跳过第二次检查,如果值不经常是1,则除了版本4之外不应该有性能命中(当然,具有分支预测的硬件将主要否定它)

答案 2 :(得分:1)

1. if (a>=1)
2. if (a>0)
3. if (a>1 || a==1)
4. if (a==1 || a>1)

在x86上,选项1和2产生cmp指令。这将设置各种寄存器。然后cmp跟随基于寄存器的条件分支/跳转。对于第一个,它会发出bge,第二个会发出bgt

选项3和4 - 理论上 - 需要两个cmp和两个分支,但编译器很可能只是优化它们与1相同。

您通常应该选择(a)遵循您正在处理的代码中的约定(b)使用最清楚地表达您正在实现的算法的那些。

有时候明确写“如果a等于1,或者它的值大于1”,那么你应该写if (a == 1 || a > 1)。但是,如果您只是检查a是否具有正的非零整数值,那么您应该写if (a > 0),因为这就是所说的。

如果您发现这种情况是性能瓶颈的一部分,您应该检查装配说明并相应地进行调整 - 例如如果您发现有两个cmp和分支,那么编写代码以使用一个比较和一个分支。

答案 3 :(得分:0)

都能跟得上!对于int,它们都是相同的。但是,我更愿意使用if (a>0)