что лучше "для (int i = 0; i! = 5; ++ i)" или "для (int i = 0; i <= 5; i ++)"? - PullRequest
0 голосов
/ 19 января 2011

что лучше for(int i = 0; i != 5; ++i) или for(int i = 0; i <= 5; i++)?

Пожалуйста, объясните, если это возможно, обоснование.

Я где-то читал, что! = Оператор лучше, чем операторы сравнения.Кроме того, оператор предварительного увеличения лучше, чем оператор последующего увеличения, поскольку для хранения промежуточного значения не требуется никакой временной переменной.

Есть ли лучшая форма цикла for, чем эти два?

ps: я использую первый, предложенный одним из источников, который я сейчас не помню.

Ответы [ 6 ]

11 голосов
/ 19 января 2011

Существует как минимум две разницы:

  • первая будет повторяться 5 раз (от 0 до 4), а вторая - 6 раз (от 0 до 5).

    Это логическое различие, и оно зависит от того, что вам нужно сделать.

    Если для второго примера вы имели в виду i<=4 (против i!=5), вы не должныt беспокойство: любой компилятор всегда сможет оптимизировать такое тривиальное выражение, даже если оптимизация отключена.

  • второе отличие заключается в использовании оператора ++: в случае, если вы используетепрефиксная версия, тогда как в другой - постфиксная версия.

    Это не имеет значения для нативных типов, но может иметь некоторые отличия от пользовательских типов (то есть классов, структур, перечислений, ...),поскольку пользователь может перегрузить оператор, а постфиксный (var ++) иногда может быть немного медленнее.

2 голосов
/ 20 января 2011

Как правило, вы должны писать для ЛЮДЕЙ, а не компьютера.

Форма "for (i = 0; i <5; i ++)" очень ясно показывает, что допустимый диапазон - "от 0 до 4".и ничего больше. </p>

И, как говорили другие люди, эта форма гарантирует, что смешной код в цикле с гораздо меньшей вероятностью вызовет бесконечный цикл.И как уже говорили другие люди, используйте форму, которая отражает то, что вы имеете в виду.

Обратите внимание, что «меньше чем» - это идиома, обычно используемая в c (что означает, что больше программистов будут ожидать этого).Это еще одна причина, чтобы предпочесть форму "for (i = 0; i <5; i ++)". </p>

2 голосов
/ 19 января 2011

Использование «i <5» будет той формой, которую большинство людей ожидают увидеть в цикле for на основе обычного использования. Конечно, нет ничего плохого в «i! = 5» или «i <= 5» (ожидайте, что они дадут различное число циклов), но если я увижу любую из этих форм, мне придется остановиться и подумать, потому что это не самая распространенная форма. </p>

Так что я бы всегда писал «i <5», если не было веской причины поступать иначе </p>

1 голос
/ 19 января 2011

, что лучше для (int i = 0; i! = 5; ++ i) или для (int i = 0; i <= 5; i ++)? </p>

2-й, так как это оператор Болиана, тогда это для (int i = _ ; i <= __ или т. Д .; приращение i ++)? -> он широко используется, как сейчас, даже когда новички в программировании.

1 голос
/ 19 января 2011

Мой учитель по языку C ++ сказал мне использовать канонические формы: for(int x=0; x != 5; ++i)

Ты другой работает просто отлично, но предположим, что ты хочешь использовать цикл на итераторе. Тогда <= не нужно правильно определять, и постфикс inc может заставить вашу программу тратить много времени на копирование объектов. </p>

Поэтому он заставил нас использовать формы

for(int i=begin; x != end; ++i) и for(int i=begin; end != i--; )

0 голосов
/ 19 января 2011

Вы должны использовать любой из <, <=, != и т. Д., Который наилучшим образом выражает логику вашего приложения, но если нет причин предпочитать какой-либо конкретный стиль, будьте последовательны. При информировании об этом решении операторы < и != имеют преимущество, заключающееся в возможности сравнения индексов на основе 0 и значений sizeof или STL-стиля size / length, например:

for (size_t i = 0; i < my_vector.size(); ++i)
    ...

Операторы < и <= иногда защищают от увеличения после завершающего значения (если у вас есть другое условие внутри цикла, в котором вы увеличиваете / добавляете i, или есть некоторое округление с плавающей запятой / несоответствие представлений). На самом деле это не часто важно, но сохранение случайной ошибки лучше, чем ничего.

Учитывая, что «<» является пересечением этих двух множеств, это популярный выбор. На мой взгляд, <code>< также сообщает о состояниях, в которых работает цикл ... более позитивное утверждение, чем стиль !=. В общем, отрицательные утверждения не приветствуются в программировании (например, bool invalid сложнее надежно разобраться с головой, чем bool valid, особенно в сложных логических выражениях и при введении двойных отрицаний).

Это конечно для числовых типов. Другие типы могут подразумевать другие стили ... например, использование != sentinel. Я предпочитаю, чтобы выбор оператора помогал задокументировать эти последствия использования типа, хотя это личный выбор и, возможно, излишний.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...