синтаксис сравнения двух разных вещей - PullRequest
2 голосов
/ 20 июня 2011

Следующая программа выдает ошибку

#include<stdio.h>
int main ()
{
int a=10,b;
a>=5?b=100:b=200;
printf("\n%d",b);
}

ошибка

ka1.c: In function ‘main’:
ka1.c:5: error: lvalue required as left operand of assignment

теперь, если я заменю строку

a>=5?b=100:b=200;

на

a>=5?b=100:(b=200);

и затем скомпилировать, тогда ошибки нет.Поэтому я хотел знать, что не так с

a>=5?b=100:b=200;

Ответы [ 3 ]

10 голосов
/ 20 июня 2011

Тернарный оператор (?:) имеет более высокий приоритет , чем оператор назначения (=). Таким образом, ваше первоначальное утверждение интерпретируется как:

((a >= 5) ? (b = 100) : b) = 200;

Напишите это вместо этого:

b = (a >= 5) ? 100 : 200;

Это идиоматический C. (Скобки вокруг условия на самом деле не нужны, но они помогают удобочитаемости.)

3 голосов
/ 20 июня 2011

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

Таким образом, a ? b : c будет таким же, как b, если a истинно, или c если a ложно.

Правильный способ использования этого оператора - присвоить результат переменной:

b = a>= 5 ? 100 : 200;
1 голос
/ 20 июня 2011

Потому что он пытается сделать: (a>=5?b=100:b)=200 Но в скобках нет значения lvalue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...