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

时间:2020-03-06 14:45:34  来源:igfitidea点击:

例如

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

被认为是可以接受的(不合法,我的意思是说这是``好的代码''),还是应该始终处于有条件的状态?

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

解决方案

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

我没有发现任何问题。如果有的话,它会更加简洁,我认为大多数具有中等经验的开发人员都希望使用它。

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

我通常会比后者做前者。

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

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

如果返回类型为bool,则可以接受。

我宁愿写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;

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

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

第一种情况非常好,比第二种情况更好,恕我直言。出于可读性考虑,我个人会这样做

return  (a > 10);

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

return a > 10 ? 1 : 0;

...更有意义,因为我们返回的是int而不是布尔值。

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

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

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

我刚刚在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; }

启用某种优化后,所有这些代码的生成代码都是相同的。因此,我们应该使用最容易阅读的变体。