Ошибка error: lvalue required as left operand of assignment
#include <stdio.h>
int main() {
int a, b, c, y;
printf("Введите число a: ");
scanf("%d", &a);
printf("Введите число b: ");
scanf("%d", &b);
printf("Введите число c: ");
scanf("%d", &c);
a > b ? (a > c ? y = a : y = c) : (b > c ? y = b : y = c);
printf("Наибольшее число: %d\n", y);
return 0;
}
Выдает ошибку. Не могу понять в чем ошибка.
Ответы (3 шт):
У вас ошибка из-за неправильно использования тернарного оператора. Правильно использование предполагает использование выражений, а не выполнение операций.
Что это значит? Если вы хотите выполнить операцию присваивания, вам нужно использовать следующую структуру:
variable = condition ? resultA : resultB
Если наложить это на ваш пример, получится такая вот запись:
y = a > b
? (a > c ? a : c)
: (b > c ? b : c);
Это развернутый пример использования. Более компактный:
y = a > b ? (a > c ? a : c) : (b > c ? b : c);
ну в целом, выше ответили уже: в тернарном операторе (? :) используется операция присваивания (y = a), которая является правой частью тернарного выражения. Внутри тернарного оператора должно быть значение, которое можно присвоить, а не выражение с присваиванием.
Выражение
a > c ? y = a : y = c
из-за определенного правилами языка порядка операций читается компилятором как
((a > c) ? (y = a) : y) = c
Важно сказать что это выражение а не инструкция, как в ряде других языков. В Си оно не может находится слева от оператора присвоения.
Можно написать так же, как написано со вложенными тернарными операциями:
a > c ? (y = a) : (y = c)
но это лишнее, если только мы не хотим сделать что-то вроде a > c ? (y = a, z = c) : (y = c, z = a)
. и тогда уж лучше использовать if
, если это не какой-то страшно запутанный код где все записано в один вложенный for()
. Раз это выражение, то оно может быть справа от присвоения:
y = a > b ? (a > c ? a : c) : (b > c ? b : c);
В процессе отладки лучше использовать легко читаемый формат
y = a > b
? (a > c ? a : c)
: (b > c ? b : c);