Почему a<=20? b=10 : c=30;
дает ошибку lvalue?lvalue требуется как левый операнд присвоения -error in?: In C
error: lvalue required as left operand of assignment
Это потому, что b = 10 и c = 30 являются утверждениями, а не выражениями?
Почему a<=20? b=10 : c=30;
дает ошибку lvalue?lvalue требуется как левый операнд присвоения -error in?: In C
error: lvalue required as left operand of assignment
Это потому, что b = 10 и c = 30 являются утверждениями, а не выражениями?
Ваш код не содержит круглых скобок вокруг назначений.
компилируется и работает правильно:
int a = 20, b = -1, c = -1;
a<=20? (b=10) : (c=30);
printf("b=%d, c=%d\n", b, c);
Примечание: Само собой разумеется, что такие (MIS) использование троичного оператора отрицательно влияет на читаемость кода, и должны следует избегать в пользу обычного заявления if
.
Это происходит потому, что условный оператор имеет более высокий приоритет, чем оператор присваивания и выражение интерпретируется как
((a<=20)? (b=10) : c)=30;
Что возвращается из условного оператора не именующий (N1570 6.5.15, сноска 110), таким образом, программа выдаст ошибку компиляции.
Вы можете использовать круглые скобки для преодоления этой проблемы с приоритетом.
a<=20? (b=10) : (c=30);
Использование обычной if
заявление должно быть лучше, если у вас есть какие-то причины, как:
if (a <= 20) {
b = 10;
} else {
c = 30;
}