Следует ли использовать <или <= в цикле for - PullRequest
124 голосов
/ 08 октября 2008

Если бы вам пришлось повторять цикл 7 раз, вы бы использовали:

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

или

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

Есть два соображения:

  • производительности
  • удобочитаемость

Для производительности я предполагаю Java или C #. Имеет ли значение, если используется «меньше» или «меньше или равно»? Если у вас есть понимание другого языка, укажите, какой.

Для удобства чтения я предполагаю массивы, основанные на 0.

UPD: Мое упоминание о массивах на основе 0 может привести к путанице. Я не говорю об итерации элементов массива. Просто общий цикл.

Ниже приведен хороший пункт об использовании константы, которая объясняет, что это за магическое число. Так что, если бы у меня было "int NUMBER_OF_THINGS = 7", то "i <= NUMBER_OF_THINGS - 1" выглядело бы странно, не правда ли.

Ответы [ 39 ]

4 голосов
/ 08 октября 2008

В Java 1.5 вы можете просто сделать

for (int i: myArray) {
    ...
}

так что для случая массива вам не нужно беспокоиться.

4 голосов
/ 08 октября 2008

Я бы сказал, используйте версию «

Я бы не беспокоился о том, быстрее ли "<", чем "<=", просто перейдите к удобочитаемости. </p>

Если вы хотите увеличить скорость, учтите следующее:

for (int i = 0; i < this->GetCount(); i++)
{
  // Do something
}

Для увеличения производительности вы можете слегка изменить его на:

const int count = this->GetCount();
for (int i = 0; i < count; ++i)
{
  // Do something
}

Обратите внимание на удаление GetCount () из цикла (потому что это будет запрашиваться в каждом цикле) и изменение «i ++» на «++ i».

4 голосов
/ 08 октября 2008

В C ++ я предпочитаю использовать !=, который можно использовать со всеми контейнерами STL. Не все итераторы контейнеров STL менее чем сопоставимы.

3 голосов
/ 08 октября 2008

Во-первых, не используйте 6 или 7.

Лучше использовать:

int numberOfDays = 7;
for (int day = 0; day < numberOfDays ; day++){

}

В этом случае это лучше, чем использовать

for (int day = 0; day <= numberOfDays  - 1; day++){

}

Еще лучше (Java / C #):

for(int day = 0; day < dayArray.Length; i++){

}

И даже лучше (C #)

foreach (int day in days){// day : days in Java

}

Обратный цикл действительно быстрее, но так как его труднее читать (если не вы другие программисты), лучше избегать.

2 голосов
/ 08 октября 2008

Я согласен с толпой, которая говорит, что 7 имеет смысл в этом случае, но я бы добавил, что в случае, когда 6 важен, скажем, вы хотите прояснить, что вы действуете только на объекты до 6-го индекса , тогда <= лучше, так как это делает 6 легче увидеть. </p>

2 голосов
/ 08 октября 2008

Еще в колледже, я помню кое-что об этих двух операциях, схожих по времени вычислений на процессоре. Конечно, мы говорим на уровне сборки.

Однако, если вы говорите на C # или Java, я действительно не думаю, что одно будет ускорением по сравнению с другим. Несколько наносекунд, которые вы получите, скорее всего, не стоит вводить в заблуждение.

Лично я бы написал код, который имеет смысл с точки зрения реализации бизнеса, и убедился бы, что его легко прочитать.

2 голосов
/ 08 октября 2008

В качестве небольшого отступления, при просмотре массива или другой коллекции в .Net я нахожу

foreach (string item in myarray)
{
    System.Console.WriteLine(item);
}

, чтобы быть более читабельным, чем числовой цикл for. Это, конечно, предполагает, что сам фактический счетчик Int не используется в коде цикла. Я не знаю, есть ли изменение производительности.

2 голосов
/ 08 октября 2008

Это относится непосредственно к категории "Создание неправильного кода, выглядящего неправильно" .

В языках индексации, начинающихся с нуля, таких как Java или C #, люди привыкли к различным условиям index < count. Таким образом, использование этого фактического соглашения сделало бы ошибочные ошибки более очевидными.

Относительно производительности: любой хороший компилятор, достойный своего объема памяти, должен отображаться, например, как не проблема.

1 голос
/ 08 октября 2008

Привычка использовать <сделает ее совместимой как для вас, так и для читателя, когда вы выполняете итерацию по массиву. Для всех будет проще иметь стандартное соглашение. И если вы используете язык с массивами, основанными на 0, то <является соглашением. </p>

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

Еще одно замечание: лучше бы иметь привычку делать ++ i, а не i ++, поскольку выборка и приращение требуют временного, а приращения и выборки - нет. Для целых чисел ваш компилятор, вероятно, оптимизирует временное отключение, но если ваш тип итерации более сложный, он может не справиться.

1 голос
/ 08 октября 2008

Вы также можете использовать != вместо этого. Таким образом, вы получите бесконечный цикл, если сделаете ошибку при инициализации, в результате чего ошибка будет замечена раньше, и любые проблемы, которые она вызывает, будут ограничены застреванием в цикле (вместо того, чтобы иметь проблему намного позже и не найти это).

...