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
заявление.