10

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

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

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

当我将行更改为

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

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

问题:为什么在结构中前缀递增优于后缀递增for?或者... Checkstyle 是不是错了?

4

2 回答 2

14

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

非法令牌

检查非法令牌。

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

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

我的观点是,您的规则是标准的 Java 习语,将 i++ 替换为 ++i 不会产生其他影响,让新手问自己为什么不使用标准习语。

于 2012-01-31T13:58:46.857 回答
12

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

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

于 2012-01-31T13:51:48.273 回答