2013-07-20 3 views
0

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

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

Однако, когда я запускаю его с помощью n=0, условное вычисляется как true. Фактически, условное значение всегда, кажется, оценивается как истинное.

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

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

И вы просите нас ответить на этот вопрос за вас? Как это вам поможет? вы пытались скомпилировать его? –

+1

Вы сначала прочитали главу о приоритете оператора? – RiaD

+0

Я считаю, что это не законно, я уверен, что вам нужно будет сказать if (n> = 1 && n <= 10), но не цитируйте меня на этом, поэтому я оставляю это как комментарий и не ответ. Как только вы настроите его таким образом, приоритет будет оставлен вправо. И я думаю, что C и C++ используют «ленивые» проверки, поэтому .. если левая сторона не удалась, она даже не будет проверять правильную сторону. –

ответ

10

>= оператора вычисляется слева направо, так он равен:

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"); всегда будет напечатано

+0

Идеально, спасибо. Это было очень полезно. –

4

Это evaluated left to right так:

n = 5; 

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

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

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)