Подтвердить что ты не робот

Оператор программирования С++

Почему этот код всегда создает x=2?

unsigned int x = 0;
x++ || x++ || x++ || x++ || ........;
printf("%d\n",x);
4b9b3361

Ответ 1

первый x++ изменяет x на 1 и возвращает 0
второй x++ изменяет x на 2 и возвращает 1

в этот момент или короткое замыкание, возвращает true и оставляет x на 2.

Ответ 2

x ++ || x ++ || x ++ || x ++ ||........;

  • Сначала x ++ сначала оценивает значение 0 для условной проверки, за которым следует приращение. Таким образом, первое условие выходит из строя, но x увеличивается на 1.
  • Теперь оценивается второй x ++, который оценивает значение 1 для условной проверки, а x увеличивается до 2. Поскольку выражение оценивается как 1 (true), нет необходимости идти дальше.

Ответ 4

|| коротких замыканий. Оценивается слева, когда истинное значение найдено (отличное от нуля), оно перестает оценивать, так как выражение теперь истинно и никогда больше не может быть ложным.

Сначала x++ оценивается как 0 (так как после него), второй - 1, а это верно, и вы закончили!

Ответ 5

Когда вы оцениваете "a || b || c || d || e ||...", вы можете прекратить оценку при первом ненулевом значении, которое вы найдете.

Первый "x ++" оценивается в 0 и увеличивает x до 1, и оценка выражения продолжается. Второй x ++ оценивается в 1, увеличивается с x на 2, и в этот момент вам не нужно смотреть на остальную часть инструкции OR, чтобы знать, что она будет правдой, поэтому вы остановитесь.

Ответ 6

Потому что логическое ИЛИ короткое замыкание при обнаружении истины.

Итак, первый x ++ возвращает 0 (false), потому что это пост-инкремент. (x = 1) Второй x ++ возвращает 1 (true) - короткое замыкание. (x = 2)

Отпечатки x = 2;

Ответ 7

Из-за ранней оценки сравнений.

Это эквивалент

 0++ | 1++

Компилятор завершает сравнение, как только x == 1, после чего он добавляет шаг, делая x == 2

Ответ 8

Поскольку первый "x ++ || x ++" оценивается как "true" (это означает, что он не равен нулю, потому что "0 || 1" истинно. Поскольку все логические операторы OR игнорируют остальные операции OR.

Mike

Ответ 9

Оператор || оценивает левое выражение, а если оно равно 0 (false), то он будет оценивать правое выражение. Если левая сторона не равна 0, то она вообще не будет оценивать правую сторону.

В выражении x++ || x++ || x++ || ... оценивается первая x++; он оценивается в 0, а x увеличивается до 1. Выполняется оценка второго x++; он оценивает значение 1, а x увеличивается на 2. Поскольку второй x++, вычисляемый на ненулевое значение, не вычисляется ни одно из оставшихся выражений x++.

Ответ 10

пытается заменить || на |.--

Это короткое замыкание логических операторов.

Это та же самая причина, когда вы делаете

if (returns_true() || returns_true()){ }

returns_true вызывается только один раз.