Скажем, у меня есть следующий цикл в C: while (x1 && x2). Если первое условие ложно (x1 == 0), тогда будет ли цикл while проверять второе условие?

2
Placeholder 25 Ноя 2016 в 19:41

4 ответа

Лучший ответ

Если первое условие ложно (x1 == 0), тогда будет ли цикл while проверять второе условие?

Нет, не будет.

Это называется оценка короткого замыкания .

Из C11, 6.5.13:

В отличие от побитового двоичного оператора &, оператор && гарантирует оценку слева направо; если вычисляется второй операнд, существует точка последовательности между оценками первого и второго операндов. Если первый операнд сравнивается с 0, второй операнд не оценивается.


Аналогично в cond1 || cond2, если cond1 оценивается как true , то cond2 не будет оцениваться. См. C11, 6.5.14:

В отличие от побитового | оператор || оператор гарантирует оценку слева направо; если вычисляется второй операнд, существует точка последовательности между оценками первого и второго операндов. Если первый операнд не равен 0, второй операнд не оценивается.

3
usr 25 Ноя 2016 в 16:51

Если первое условие оценивается как ложное, стандартное условие не гарантирует выполнение второго условия.

Из раздела 6.5.13 стандарта стандарта C :

4 В отличие от побитового двоичного оператора &, оператор && гарантирует оценку слева направо; если второй операнд оценивается, существует точка последовательности между оценками первого и второго операндов. Если первый операнд сравнивается с 0, второй операнд не оценивается.

1
dbush 25 Ноя 2016 в 16:47

Нет, если первое условие ложно, он сразу остановится на этом.
Таким образом, вы можете избежать ошибок, таких как ошибки сегментации, если вы хотите проверить такие вещи, как if (arrayLength < 10 && array[15] == 'c'), предполагая, что arrayLength - это длина массива.

0
user3794667384 25 Ноя 2016 в 16:41

C выполняет оценку короткого замыкания. Если x1 ложно, все выражение не может быть истинным, поэтому x2 никогда не вычисляется.

0
Jonathan Leffler 14 Сен 2017 в 03:34