Вопрос

У меня есть простой вопрос, который я задаю главным образом из любопытства.

В чем разница между этими двумя строками кода?(на С++)

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++)
   ...
}

Другие советы

Использование такой запятой просто отказаться от первого условия.

Оператор запятая означает «выполнить эти операторы в указанном порядке и принять значение последнего».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top