C против Python — приоритет оператора в условных выражениях

Как C обрабатывает условное выражение, такое как n >= 1 <= 10?

Я изначально думал, что это будет оценено как n >= 1 && 1 <= 10, как это будет оцениваться в Python. поскольку 1 <= 10 всегда верно, вторая часть and является избыточным (логическое значение X && True эквивалентно логическому значению X).

Тем не менее, когда я запускаю его с n=0условное значение оценивается как истинное. На самом деле, условное всегда кажется верным.

Это был пример, на который я смотрел:

if (n >= 1 <= 10)
printf("n is between 1 and 10\n");

0

Решение

>= Оператор вычисляется слева направо, поэтому он равен:

if( ( n >= 1 ) <= 10)
printf("n is between 1 and 10\n");

Первый ( n >= 1 ) оценивается как истинное или ложное, что равно 1 или 0. Затем этот результат 1 или 0 сравнивается с result <= 10 который всегда будет оцениваться как истина.
Таким образом, утверждение printf("n is between 1 and 10\n"); всегда будет напечатан

10

Другие решения

Это оценивается слева направо как это:

n = 5;

if (n >= 1 <= 10)
// then
if (1 <= 10)
// then
if (1)

Сначала проверяется, n >= 1, Если это так, он оценивает 1, иначе 0, Это приводит к следующей оценке, 1 <= 10, который оценивает 1 также. Обратите внимание, что это также удачно:

n = 5;
if (n >= 3 == 1)

Потому что это оценивается так:

n = 5;
if (n >= 3 == 1) // but you should never write code like this
// then
if (1 == 1)
// then
if (1)

Также обратите внимание, почему это работает с n = 0

n = 0;
if (n >= 1 <= 10)
// then
if (0 <= 10) // 0 isn't greater or equal to 1, so 0 (false) is "returned"// then
if (1) // but 0 is less than or equal to 10, so it evaluates as 1 (true)
4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector