В выражении "for" я должен использовать `! =` Или `<`?
Я видел оба этих утверждения:
for(i=0;i<10;i++)
for(i=0;i!=10;i++)
Я знаю, что все они останавливаются, когда я достигаю 10
, но лучше использовать второй (я слышал).
В чем разница? Я также хочу знать, когда использовать итератор для доступа к члену вектора, в чем разница между условием итератора < vec.end()
и != vec.end()
Ответы
Ответ 1
for(i = start; i != end; ++i)
Это "стандартный" цикл итератора. Преимущество заключается в том, что он работает как с указателями, так и с итераторами стандартных библиотек (вы не можете полагаться на итераторы с operator<
).
for(i = start; i < end; ++i)
Это не будет работать со стандартными итераторами библиотек (если только они не определены operator<
), но это имеет то преимущество, что если вы по какой-то причине проходите мимо end
, он все равно остановится, поэтому он будет немного безопаснее. Меня научили использовать это при итерации по целым числам, но я не знаю, действительно ли это считалось "лучшей практикой".
Как я обычно пишу это, предпочитаю <
.
Ответ 2
Оба будут работать в большинстве ситуаций.
Если по какой-то причине тело кода, выполняемое в цикле, меняет i
на нечто большее, чем 10
, первая версия остановит цикл, но вторая будет выполняться вечно.
Ответ 3
Моя повседневная практика заключается в использовании <
, когда я повторяю цикл с простыми типами, например целыми числами, и использую !=
, когда я работаю с итераторами stl-типа
Ответ 4
for ( initialization ; termination condition ; iteration )
Для каждого из них выберите наиболее подходящий для ваших требований, для termination condition
вы можете использовать любой из двоичных условных операторов, таких как >
, <
, >=
, <=
, !=
Для данного вопроса рассмотрим случайный случай, в котором
for(i=0;i!=10;i++)
{
.
.
i=11; //somewhere if the loop variable is changed to a value greater than 10 (this assumption is solely for demo)
.
.
.
}
В этом случае цикл оказывается бесконечным. скорее, если вы используете условие i<10
, это работает как обычно. поэтому я хочу сказать, что первый подход более безопасен для строгого условия.
Ответ 5
Лучшей практикой является использование!= только с итераторами (С++) и < в противном случае. Никогда не используйте == or!= С float/double. Следующий цикл представляет собой бесконечный цикл:
for (double i = 0.0; i != 1.0; i += 0.1)
printf("yes, I'm an infinite loop ;)");
Ответ 6
!= позволит тестировать значение true, если значение я превышает 10, тогда как < заставит его оценивать false, если я превысил 10 или просто стал равным ему.
Если значение я может измениться внутри тела цикла, это может быть соображением.
Если, однако, вы просто хотите сделать что-то определенное количество раз, < более наглядно, но этого было бы достаточно.!= должен, для простых сквозных циклов с шагами-10-пунктами-и-до-хрюкать, считаться субоптимальными с точки зрения того, чтобы быть явным о вашем намерении.
Ответ 7
Я знаю, что все они останавливаются, когда я достигаю 10, но лучше использовать второй (я слышал).
Это микро-оптимизация. Используйте все, что имеет смысл (и выше <
имеет больше смысла).
В чем разница?
В первой версии используется оператор неравенства !=
, а второй использует меньший оператор <
.
Ответ 8
Я обычно использую <
для for-loops по причинам, указанным другими. Тем не менее, в while-loops и более продвинутых for-loops, !=
упрощает рассуждения о том, что делает моя программа.
Скажем, я хочу найти позицию после первого запуска '5 в массиве типа [5,5,5,3,5,2,3,2,0]
. То есть мы хотим k
, чтобы 0 <= i < k => a[i] = 5
:
int pos = 0;
// Inv: a[0..pos) = 5
while (pos != N && a[pos] == 5)
pos = pos+1;
Как только цикл был выполнен, мы знаем, что инвертор защиты цикла имеет значение true: pos == N || a[pos] != 5
. В любом случае мы хотим pos
.
Теперь скажем, что мы использовали <
в защите цикла, тогда все, что мы знали бы после этого, было pos >= N || a[pos] != 5
, но это не та ситуация, в которой мы хотели быть. Выполняя намного больше работы, мы можем доказать, что мы не может быть в pos > N
, но швы подобны пустой трате времени по сравнению с использованием !=
в защитной петле.