Разница в производительности в условиях цикла?
-
11-09-2019 - |
Вопрос
У меня есть простой вопрос, который я задаю главным образом из любопытства.
В чем разница между этими двумя строками кода?(на С++)
for(int i = 0; i < N, N > 0; i++)
for(int i = 0; i < N && N > 0; i++)
Выбор условий совершенно произволен, меня просто интересуют различия между , и &&.
Я ни в коем случае не новичок в программировании, но я никогда не заморачивался с оператором запятой.
Есть ли различия в производительности/поведении или это чисто эстетическое явление?
И последнее замечание: я знаю, что есть более производительные рыбы, чем условный оператор, но мне просто любопытно.Побалуйте меня.
РедактироватьСпасибо за ваши ответы.
Оказывается, код, который вызвал этот вопрос, неправильно использовал оператор запятой, как я описал.Мне было интересно, в чем разница и почему это не оператор &&, но он просто был написан неправильно.Я не думал, что с этим что-то не так, потому что все работало нормально.Спасибо, что расправили меня.
Решение
Хотя это похоже на то,
for(int i = 0; i < N, N > 0; i++)
и
for(int i = 0; i < N && N > 0; i++)
не эквивалентны.
Вот доказательство.
int main(int argc, char* argv[])
{
int N = 10;
int i = 5;
int val = (N, i);
cout << val << endl;
}
Результат:
5
Это означает, что при определении момента выхода из цикла будет использоваться N > 0
.Если N = 10
, это означает, что оно всегда будет истинным и цикл никогда не завершится.
Запустите это и посмотрите доказательство.
int main(int argc, char* argv[])
{
int N = 10;
int i = 5;
for(int i = 0; i < N, N > 0; i++){
cout << val << endl;
}
}
bash-2.05$ ./a.out
0
1
2
3
4
5
6
7
8
9
10
11
...
142
143
144
145
146
147
148
^C
Если n является постоянной или переменной, которая не меняется внутри цикла, то вы можете просто удалить N > 0
проверьте, проверив сначала один раз, т.е.
if (N > 0){
for (int i = 0; i < N; i++)
...
}
Другие советы
Использование такой запятой просто отказаться от первого условия.
Оператор запятая означает «выполнить эти операторы в указанном порядке и принять значение последнего».