lvalue требуется как левый операнд присваивания -error в?: в C

Почему a<=20? b=10 : c=30; дать ошибку lvalue?

error: lvalue required as left operand of assignment

потому что b=10 и c=30 - операторы, а не выражения?

2 ответа

Это связано с тем, что условный оператор имеет более высокий приоритет, чем оператор присваивания, а выражение интерпретируется как

((a<=20)? (b=10) : c)=30;

То, что возвращается от условного оператора, не является lvalue ( N15706.5.15, сноска 110), поэтому программа выдаст ошибку компиляции.

Вы можете использовать скобки, чтобы преодолеть эту проблему приоритета.

a<=20? (b=10) : (c=30);

Используя нормальный if Утверждение должно быть лучше, если у вас нет таких причин, как:

  • Занимаюсь гольфом
  • Попытка сделать вашу программу трудной для чтения
  • Хотите использовать то, что возвращается из выражения
if (a <= 20) {
    b = 10;
} else {
    c = 30;
}

В вашем коде отсутствуют круглые скобки вокруг заданий.

Это компилируется и работает правильно:

int a = 20, b = -1, c = -1;
a<=20? (b=10) : (c=30);
printf("b=%d, c=%d\n", b, c);

Demo.

Примечание: само собой разумеется, что такое (неправильное) использование троичного оператора отрицательно влияет на читабельность вашего кода, и его следует избегать в пользу регулярного if заявление.

Другие вопросы по тегам