2012-01-31 46 views
10

我最近安装了Checkstyle插件,用于Eclipse,并且个人认为它太棒了。但它给我的警告之一有点模糊。确切的警告是“不允许使用++”。它是关于后缀++在某一行像为什么使用前缀增量被认为比标准建设中的后缀增量更好

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

好吧,我很清楚,foreach是迭代更好的建设,但不能处处适用,有时老派++是唯一的选择。

当我改变该行

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

警告消失。我知道i++++i之间以及这一点我的生活我认为他们在标准for建设互换的差异。但Checkstyle认为i++有害(或容易出错)。

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

+0

预增量可以在例如C++在复杂的用户定义类型上有运算符重载时。但是我不明白为什么它会对Java基元产生影响。 – 2012-01-31 13:50:41

回答

11

后缀递增使得在需要的改性之前的旧值的表达式仅使用时的感觉。在丢弃该值的无效上下文中(如在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++中特别地,这两个运营商可以被重载,和后缀的执行可以的,因为返回旧值的要求是无效率的 - 它通常涉及复制旧对象以符合postfix运算符的原始语义。

随着原始类型,任何像样的编译器将产生对两种情况下相同的代码,但第二个是从语言的语义观点来看更好。

12

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

IllegalToken

检查非法令牌。

理性:某些语言特性往往导致难以维持 代码或是非显而易见的开发新手。在某些框架中,其他功能可能不支持 ,例如在EJB组件中没有本地方法 。

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

我的看法是,你的规则是一个标准的Java成语,而且取代我++ ++我将有一个让新手问自己,为什么不使用标准的成语没有其他作用。