10

例如

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

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

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

12 回答 12

37

这是可以接受的 - 如果您的返回类型是bool

于 2008-09-26T00:56:23.023 回答
31

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

于 2008-09-26T00:45:02.283 回答
13
return a > 10 ? 1 : 0;

... 更有意义,因为您返回的是 int,而不是 bool。

于 2008-09-26T01:11:14.093 回答
6

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

   return  (a > 10);

但这是一个小问题,并不是每个人都会同意。

于 2008-09-26T01:01:16.723 回答
4

我看不出有什么问题。如果有的话,它更简洁,我认为大多数经验适中的开发人员会更喜欢它。

于 2008-09-26T00:45:20.303 回答
2

第一个对我来说更可取,因为它更简洁。(并且它避免了多次退货:)

于 2008-09-26T00:45:26.713 回答
2

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

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

我从来不明白人们为什么写作

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

而不是平原

mybool = expr;

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

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

于 2008-09-26T00:56:53.863 回答
1

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

我认为您提供的第二种选择几乎更糟,因为它涉及分支语句和多个返回语句,这些东西增加了方法的复杂性,同时降低了它的可读性。

于 2008-09-26T00:50:32.943 回答
1

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

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

于 2008-09-26T19:52:42.047 回答
1

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

于 2008-09-26T16:03:01.287 回答
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; }

一旦您启用了一些优化,为所有这些生成的代码都是相同的。所以你应该使用最容易阅读的变体。

于 2010-07-29T04:52:16.890 回答
0

我通常会做前者而不是后者。

于 2008-09-26T00:47:07.350 回答