Следует ли использовать <или <= в цикле 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 ]

0 голосов
/ 05 ноября 2008

Нет разницы в скорости, но <, скорее всего, будет правильным на языке с массивами на основе 0. Кроме того, если вы хотите выполнить итерацию вниз, а не вверх, вы можете сказать: </p>

for (i = 7; --i >= 0; ) ...
0 голосов
/ 27 октября 2008

Преждевременная оптимизация - корень всего зла. Идите с удобочитаемостью, если нет веских причин беспокоиться о < более <=.

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

Я думаю, что все в порядке, но когда вы выбрали, придерживайтесь одного или другого. Если вы привыкли использовать <=, то старайтесь не использовать <и наоборот. </p>

Я предпочитаю <=, но в ситуациях, когда вы работаете с индексами, которые начинаются с нуля, я, вероятно, попробую использовать <. Это все личные предпочтения, хотя. </p>

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

Строго говоря, с логической точки зрения, вы должны думать, что < count будет более эффективным, чем <= count, именно по той причине, что <= будет также проверять на равенство.

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

Результаты не имеют смысла.

С аппаратной точки зрения, <= с loopNuumber-1 введет одно дополнительное вычисление для выполнения loopNumber-1 на каждую итерацию. Поэтому я предполагаю, что <займет меньше времени, если не столько времени, сколько <= </p>

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

Не должно быть разницы в производительности по крайней мере с компиляторами x86. JL и JLE работают одновременно, насколько я знаю. А что касается возможности восстановления, использование «<7» для массива из семи элементов имеет смысл. </p>

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

Для некоторых языков / технологий, таких как .NET, использование .Size или .Length или size () / length () является плохой идеей, поскольку оно обращается к этому свойству при каждой итерации, поэтому назначение его переменной немного меньше удар.

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

Я предпочитаю это:

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

Однако (это всего лишь мысль), его читабельность может зависеть от того, основаны ли массивы на 0 (C #, Java) или на 1 (VB .NET). Я говорю это потому, что когда вы работаете с массивами, основанными на 0, у вас складывается мнение, что 0-6 будет работать 7 раз. Я думаю, что 0-6 более интуитивно понятен, чем 1-7. Опять же, я из C ++, Java, C # фона.

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

Я следую первому методу, так как эта идиома часто повторяется.

для (int index = 0; index

String s = oldString.substring (0, numChars);

и т.д..

Я привык исключать верхнюю границу и предпочел бы сохранить ее таким образом, если нет веской причины для ее изменения. (пример - индексирование на основе 1)

...