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

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

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

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

当我将行更改为

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

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

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

只有在修改前需要旧值的表达式中使用后缀增量才有意义。 在丢弃该值的void上下文中(就像在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 ++中,这些运算符都可以重载,并且后缀的实现可能效率低,因为需要返回旧值 – 它通常涉及复制旧对象以符合后缀运算符的原始语义。

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

这是一个愚蠢的规则,恕我直言。 它的描述在这里

IllegalToken

检查非法令牌。

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

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

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