我最近为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错了吗?
答案 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 ++中,这两个运算符都可以重载,并且后缀的实现可能效率低,因为需要返回旧值 - 它通常涉及复制旧对象以符合原始语义后缀运算符。
对于原始类型,任何体面的编译器都会为这两种情况生成相同的代码,但第二种情况从语言的语义角度来看更好。