为什么使用前缀增量被认为比构造标准中的后缀增量更好

时间:2012-01-31 13:47:41

标签: java checkstyle jls

我最近为Checkstyle安装了Eclipse插件,并且个人认为它非常棒。但它给我的一个警告有点模糊。确切的警告是“不允许使用++”。这是关于某些行中的postfix ++,如

for(int i = 0; i < SOMETHING; i++)

好的,我知道foreach是更好的迭代构造,但它无法在任何地方应用,有时老校++是唯一的选择。

当我将行更改为

for(int i = 0; i < SOMETHING; ++i)

警告消失。我知道i++++i之间的区别,就我生命的这一点而言,我认为它们在标准for构造中可以互换。但是Checkstyle认为i++有害(或容易出错)。

问题:为什么前缀增量优于for结构中的后缀增量?或者...... Checkstyle错了吗?

2 个答案:

答案 0 :(得分:14)

这是一条愚蠢的规则,恕我直言。其描述为here

  

IllegalToken

     

检查非法令牌。

     

理性:某些语言功能通常会导致难以维护   代码或对新手开发人员来说不明显。其他功能可能是   在某些框架中气馁,例如没有本地方法   在EJB组件中。

默认情况下,它禁止后缀增量,后缀减量和开关。您可以安全地禁用该规则,或以不同方式对其进行配置。

我的观点是你的规则是一个标准的Java惯用语,用++替换i ++我将没有任何其他影响,让新手问自己为什么不使用标准习语。

答案 1 :(得分:12)

仅当在修改前需要旧值的表达式中使用时,后缀增量才有意义。在无效上下文中,该值被丢弃(就像在for循环中一样),保存旧值是没有意义的。

换句话说:

// makes sense because you need the old value to subscript the array
stack[top++] = x;
// in a void context, the old value is discarded
top++;

特别是在C ++中,这两个运算符都可以重载,并且后缀的实现可能效率低,因为需要返回旧值 - 它通常涉及复制旧对象以符合原始语义后缀运算符。

对于原始类型,任何体面的编译器都会为这两种情况生成相同的代码,但第二种情况从语言的语义角度来看更好。