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

fic*_*ion 10 java checkstyle jls

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

for(int i = 0; i < SOMETHING; i++)
Run Code Online (Sandbox Code Playgroud)

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

当我将行更改为

for(int i = 0; i < SOMETHING; ++i)
Run Code Online (Sandbox Code Playgroud)

警告消失了.我知道之间的区别i++,并++i和这一点我的生活我认为他们在标准的可互换for建设.但Checkstyle认为i++有害(或容易出错).

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

JB *_*zet 14

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

IllegalToken

检查非法令牌.

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

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

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


Bla*_*iev 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++;
Run Code Online (Sandbox Code Playgroud)

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

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