Как 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");
>=
Оператор вычисляется слева направо, поэтому он равен:
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");
всегда будет напечатан
Это оценивается слева направо как это:
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)