Почему использование приращения префикса считается лучше, чем постфиксное увеличение в стандарте для построения

Недавно я установил Checkstyle для Eclipse и лично думаю, что это потрясающе. Но одно из предупреждений, которое мне дает, немного неясное. Точное предупреждение: "Использовать ++ запрещено". Речь идет о postfix ++ в некоторой строке, например

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

Хорошо, я знаю, что foreach является лучшей конструкцией для итерации, но ее нельзя применять везде, иногда старая школа ++ является единственной альтернативой.

Когда я меняю строку на

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

предупреждение исчезает. Я знаю разницу между i++ и ++i, и к этому моменту своей жизни я считал их взаимозаменяемыми в стандартной конструкции for. Но Checkstyle считает i++ вредным (или подверженным ошибкам).

Вопрос: Почему приращение префикса лучше, чем добавление постфикса в конструкциях for? Или... это Checkstyle не так?

Ответ 1

Пострикс-инкремент имеет смысл только при использовании в выражении, где вам нужно старое значение до модификации. В контекстах 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++;

В С++, в частности, оба этих оператора могут быть перегружены, а реализация постфикса может быть неэффективной из-за требования вернуть старое значение - обычно это связано с копированием старого объекта в соответствии с исходной семантикой постфиксный оператор.

С примитивными типами любой достойный компилятор будет генерировать идентичный код для обоих случаев, но второй лучше с семантической точки зрения языка.

Ответ 2

Это глупое правило, ИМХО. Его описание здесь

IllegalToken

Проверяет наличие незаконных токенов.

Rational: некоторые языковые функции часто приводят к сложным кода или неочевидны для начинающих разработчиков. Другие функции могут быть обескуражены в определенных рамках, например, не имеют собственных методов в компонентах EJB.

По умолчанию он запрещает приращения постфикса, постфиксные сокращения и переключатели. Вы можете безопасно отключить правило или настроить его по-другому.

Мое мнение таково, что ваше правило - стандартная идиома Java, и что замена я ++ на ++ я не будет иметь никакого другого эффекта, чтобы заставить новичков спросить себя, почему стандартная идиома не используется.