Почему использование приращения префикса считается лучше, чем приращение постфикса в стандарте для построения - PullRequest
10 голосов
/ 31 января 2012

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

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

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

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

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

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

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

Ответы [ 2 ]

14 голосов
/ 31 января 2012

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

IllegalToken

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

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

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

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

12 голосов
/ 31 января 2012

Постфиксное увеличение имеет смысл только при использовании в выражении, где вам нужно старое значение до изменения.В пустых контекстах, где это значение отбрасывается (как в вашем цикле 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 ++оба эти оператора могут быть перегружены, и реализация постфикса 1 может быть неэффективной из-за требования вернуть старое значение - обычно это включает в себя копирование старого объекта для соответствия исходной семантике оператора постфикса.

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

...