Почему lvalue требуется в сокращенной форме if-else в части else при использовании оператора присваивания?

    #include <stdio.h>

    void main()
    {
        int k = 8;
        int m = 7;
        int z = k < m ? k = m : m++;
        printf("%d", z);

        k = 8;
        m = 7;
        z = k < m ? m++ : k=m;
        printf("%d", z);
    }

Выход

Compile Error:
main.c: In function 'main':
main.c:19:32: error: lvalue required as left operand of assignment
         z = k < m ? m++ : k=m;
                            ^
  • Почему первое задание работает, а второе нет?
  • И почему компилятор говорит, что требуется lvalue?

1 ответ

Решение

Из-за более высокого приоритета ?: условный оператор по сравнению с =

z = k < m ? m++ : k=m;

Эквивалентно (или, скажем, анализировать как)

z = ((k < m ? m++ : k) = m);
//    ^^^^^^^^^^^^^^^^            
//    expression       = m 

m присваивается выражению, которое - Ошибка Lvalue.

Читайте Условные операторные различия между C и C++

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