Ошибка 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 шт):

Автор решения: Faraday

У вас ошибка из-за неправильно использования тернарного оператора. Правильно использование предполагает использование выражений, а не выполнение операций.

Что это значит? Если вы хотите выполнить операцию присваивания, вам нужно использовать следующую структуру:

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);
→ Ссылка
Автор решения: Alex

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

→ Ссылка
Автор решения: Swift - Friday Pie

Выражение

 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);
→ Ссылка