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

Java 为什么在构造标准中前缀增量的使用被认为比后缀增量更好,java,checkstyle,jls,Java,Checkstyle,Jls,我最近安装了一个插件,我个人认为它很棒。但它给我的警告之一有点模糊。确切的警告是“不允许使用++”。它是关于postfix++的,比如 for(int i = 0; i < SOMETHING; i++) 警告消失了。我知道I++和++I之间的区别,在我生命的这一点上,我认为它们在标准的构造中是可互换的。但是Checkstyle认为i++有害(或容易出错) 问题:为什么在结构中前缀递增优于后缀递增?或这是Checkstyle错了吗?只有在需要修改前的旧值的表达式中使用后缀递增时才有意义。

我最近安装了一个插件,我个人认为它很棒。但它给我的警告之一有点模糊。确切的警告是“不允许使用
++
”。它是关于postfix
++
的,比如

for(int i = 0; i < SOMETHING; i++)
警告消失了。我知道
I++
++I
之间的区别,在我生命的这一点上,我认为它们在标准的
构造中是可互换的。但是Checkstyle认为
i++
有害(或容易出错)


问题:为什么在
结构中前缀递增优于后缀递增?或这是Checkstyle错了吗?

只有在需要修改前的旧值的表达式中使用后缀递增时才有意义。在放弃该值的无效上下文中(就像在
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++中,尤其是,这两个运算符都可以被重载,并且后缀一的实现可能是低效的,因为需要返回旧的值-它通常涉及复制旧对象以符合后缀操作符的原始语义。
对于基元类型,任何一个好的编译器都会为这两种情况生成相同的代码,但从语言的语义角度来看,第二种情况更好。

这是一个愚蠢的规则,伊姆霍。它的描述是

非法代币

检查非法代币

Rational:某些语言特性常常导致难以维护 对于新手开发人员来说,代码或代码是不明显的。其他功能可能是 在某些框架中不受鼓励,例如没有本机方法 在EJB组件中

默认情况下,它禁止后缀递增、后缀递减和切换。您可以安全地禁用该规则,或以其他方式对其进行配置


我的观点是,你的规则是一个标准的java习语,用I+I替换I++将不会有其他的效果,让新手们问自己为什么不使用标准的习惯用法。在C++上,当你在复杂的用户定义类型上有操作符重载时,预增加可以更有效。但我不明白为什么它会对Java原语产生影响。
// 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++;