使用条件之外的比较运算符

时间:2008-09-26 00:42:58

标签: c++ c comparison-operators

例如

int f(int a) {
   ...
   return a > 10;
}

被认为是可以接受的(不合法,我的意思是它是“好的代码”),或者它应该总是在有条件的,像这样

int f(int a) {
   ...
   if (a > 10)
      return 1;
   else
      return 0;
}

12 个答案:

答案 0 :(得分:37)

如果您的退货类型为bool,则可以接受。

答案 1 :(得分:31)

绝对可以接受!实际上,Joel在最新的stackoverflow播客中提到了这一点。他说这是他向Fog Creek开始几乎所有程序员的一件事。

答案 2 :(得分:13)

return a > 10 ? 1 : 0;

...更有意义,因为你正在返回一个int,而不是一个bool。

答案 3 :(得分:6)

第一种情况非常好,远比第二种情况好,恕我直言。作为可读性问题,我个人会这样做

   return  (a > 10);

但这是次要的,并不是每个人都会同意的。

答案 4 :(得分:4)

我认为没有任何问题。如果有什么它更简洁,我认为大多数具有中等经验的开发人员会更喜欢它。

答案 5 :(得分:2)

第一个比我更好,因为它更简洁。 (它避免了多次退货:)

答案 6 :(得分:2)

我宁愿写bool f(int);,第一种形式为bool是C ++中的boolean类型。如果我真的需要返回int,我会写一些类似

的内容
int f(int) {
    ...
    const int res = (i>42) ? 1 : 0;
    return res;
}

我永远不明白人们为什么写

if (expr == true)
    mybool = true ; 
else 
    mybool = false;

而不是普通的

mybool = expr;

布尔代数是任何开发人员应该能够本能地处理的工具

此外,我宁愿定义一个名为temporary的,因为有些调试器不能很好地处理函数返回值。

答案 7 :(得分:1)

我认为它是完全可以接受的,只要你确保你付出额外的努力来保持可读性。就像我要确保方法名称非常明确,并使用好的变量名称。

我认为你提供的第二个替代方案几乎更糟糕,因为它涉及一个分支语句和多个return语句,这些事情增加了方法的复杂性,同时降低了它的可读性。

答案 8 :(得分:1)

这种语法不仅100%可接受,你还应该随意在if语句之外使用布尔表达式,即int x = i && ( j || k );(或返回类似的值)。

答案 9 :(得分:1)

我认为它的一部分与语言的风格和文化有关。您编写的第一个示例是经验丰富的C程序员所期望的。他们宁可扼杀自己,也不愿做出不必要的陈述。

我认为当语言允许它并且使用是该语言范式的一部分时,它是完全可以接受的

答案 10 :(得分:1)

我刚用GCC尝试了三种不同的变体:

int one(int x) { return (x > 42) ? 1 : 0; }
int two(int x) { return x > 42; }
int thr(int x) { if (x > 42) return 1; else return 0; }

只要启用某些优化,所有生成的代码都是相同的。所以你应该使用最容易阅读的变体。

答案 11 :(得分:0)

我通常会选择前者而不是后者。