Существует действительно не очень, можно сделать помимо взгляда на отслеживание стека; при разыменовании нескольких ссылок на объект в той же строке кода нет никакого способа определить, какой является пустым, не устанавливая точку останова. Вы могли избежать этого, только разыменовав один объект на строку, но это приведет к некоторому довольно ужасно выглядящему коду.
Хотя кажется, что
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++)
...
}
Использование такой запятой просто отбрасывает первое условие .
Оператор запятой означает «запускать эти операторы в этом порядке и брать значение последнего».