Почему этот код всегда создает x=2
?
unsigned int x = 0;
x++ || x++ || x++ || x++ || ........;
printf("%d\n",x);
Почему этот код всегда создает x=2
?
unsigned int x = 0;
x++ || x++ || x++ || x++ || ........;
printf("%d\n",x);
первый x++
изменяет x на 1 и возвращает 0
второй x++
изменяет x на 2 и возвращает 1
в этот момент или короткое замыкание, возвращает true и оставляет x на 2.
x ++ || x ++ || x ++ || x ++ ||........;
Из-за короткого замыкания в оценке булевых выражений и потому что ||
является точка последовательности в C и С++.
||
коротких замыканий. Оценивается слева, когда истинное значение найдено (отличное от нуля), оно перестает оценивать, так как выражение теперь истинно и никогда больше не может быть ложным.
Сначала x++
оценивается как 0 (так как после него), второй - 1, а это верно, и вы закончили!
Когда вы оцениваете "a || b || c || d || e ||...", вы можете прекратить оценку при первом ненулевом значении, которое вы найдете.
Первый "x ++" оценивается в 0 и увеличивает x до 1, и оценка выражения продолжается. Второй x ++ оценивается в 1, увеличивается с x на 2, и в этот момент вам не нужно смотреть на остальную часть инструкции OR, чтобы знать, что она будет правдой, поэтому вы остановитесь.
Потому что логическое ИЛИ короткое замыкание при обнаружении истины.
Итак, первый x ++ возвращает 0 (false), потому что это пост-инкремент. (x = 1) Второй x ++ возвращает 1 (true) - короткое замыкание. (x = 2)
Отпечатки x = 2;
Из-за ранней оценки сравнений.
Это эквивалент
0++ | 1++
Компилятор завершает сравнение, как только x == 1, после чего он добавляет шаг, делая x == 2
Поскольку первый "x ++ || x ++" оценивается как "true" (это означает, что он не равен нулю, потому что "0 || 1" истинно. Поскольку все логические операторы OR игнорируют остальные операции OR.
Mike
Оператор ||
оценивает левое выражение, а если оно равно 0 (false), то он будет оценивать правое выражение. Если левая сторона не равна 0, то она вообще не будет оценивать правую сторону.
В выражении x++ || x++ || x++ || ...
оценивается первая x++
; он оценивается в 0, а x увеличивается до 1. Выполняется оценка второго x++
; он оценивает значение 1, а x увеличивается на 2. Поскольку второй x++
, вычисляемый на ненулевое значение, не вычисляется ни одно из оставшихся выражений x++
.
пытается заменить ||
на |
.--
Это короткое замыкание логических операторов.
Это та же самая причина, когда вы делаете
if (returns_true() || returns_true()){ }
returns_true
вызывается только один раз.