Приоритет оператора - оценка выражения - PullRequest
8 голосов
/ 28 марта 2011

Для следующего фрагмента кода я получаю вывод как 1. Я хочу знать, как это произошло?

void main()
{
int x=10,y=20,z=5,i;
i=x<y<z;
printf("%d",i);
}

Ответы [ 7 ]

7 голосов
/ 28 марта 2011

i=x<y<z;, интерпретируется как i=(x<y)<z, что, в свою очередь, интерпретируется как i=1<z, что соответствует 1.

2 голосов
/ 28 марта 2011

10 меньше 20, в результате 1, а 1 меньше 5, в результате 1. C не связывает реляционные операторы, как это делают некоторые другие языки.

1 голос
/ 28 марта 2011

Работает следующим образом: Поскольку < является логическим выражением, x<y т.е. 10<20 является истинным, т. Е. 1. Таким образом, оно становится 1<z т.е. 1<5, которое снова является истинным, т. Е. 1, которое присваивается i. Так что i равно 1.

0 голосов
/ 03 ноября 2016

C ++ не поддерживает многоэлементные сравнения, подобные этому.

x < y < z

интерпретируется как

(x < y) < z

, то есть, определите, если x < y, тогда посмотрите, если это логическое меньше, чем z.

Существует некоторое обсуждение , почему , то есть , закончился в разработке программного обеспечения StackExchange .

Когда вы обнаружите, что пытаетесь это сделать, вместо этого вам нужно записать это в виде двух отдельных сравнений, объединенных логическим значением:

(x < y) && (y < z)
0 голосов
/ 28 марта 2011
x<y // 1 as (10 < 20) will return 1
result of(x<y)<z // 1 as (1<5) will return 1 
0 голосов
/ 28 марта 2011

какой выход вы хотели?

В С,

i = 2 < 3; //i == 1.
i = 4 < 3; //i == 0.

Если условие имеет значение false, возвращаемое значение равно 0, а в противном случае 1.
Кроме того, x

0 голосов
/ 28 марта 2011

Это потому, что ваш код оценивается как:

void main()
{
    int x=10,y=20,z=5,i;
    i=((x<y)<z); //(x<y) = true = 1, (1 < 5) = true
    printf("%d",i);
}
...