Использование скобок в выражении, включающем тернарный оператор

Возможный дубликат:
Ошибка: lvalue требуется в этом простом коде C? (Тернар с присваиванием?)

В следующем фрагменте кода я получил ошибку типа «lvalue required as left operand of assignment». Я не могу понять, почему сообщается о такой ошибке. Но когда я использую круглые скобки в таком выражении, как (i>j)?(k=i):(k=j), это не сообщает об ошибке. пожалуйста, объясни.

int main() {
    int i = 2;
    int j = 9;
    int k;

    (i>j) ? k=i : k=j;
    printf("%d\n",k);
    return 0;
}

person fuzzy    schedule 22.08.2012    source источник
comment
Посмотрите ответ Наваза в: stackoverflow.com/questions/6966299/   -  person phoxis    schedule 22.08.2012


Ответы (5)


Понятно, что это условие можно переписать получше, но ваша проблема наблюдается из-за приоритета операторов = и ?:.

Оператор присваивания ?: имеет более высокий приоритет, чем =, поэтому выражение

( i > j ) ? k = i : k = j;

Эквивалентно

(( i > j ) ? k = i : k) = j;

Что неверно, потому что вы не можете присвоить результат выражения.

На самом деле, этот случай похож на (( i > j ) : i : j) = 10;, что тоже неверно.

person Maksim Skurydzin    schedule 22.08.2012

Без ваших дополнительных () я думаю, что приоритет оператора группирует его как

   ((i>j)?k=i:k)=j;

Что, очевидно, не то, что вы хотите, и имеет проблемы с lvalue.

Исправить это с

  k= (i>j) ? i : j;

person walrii    schedule 22.08.2012

Как насчет того, чтобы писать так.

int main()
 {
   int i,j,k;
   i=2;j=9;
   k = (i > j) ? i : j;
   printf("%d\n",k);
   return 0;
 }
person swemon    schedule 22.08.2012

Скорее :

k = i > j ? i : j;
person Stephane Rouberol    schedule 22.08.2012

Вам нужно присвоить возвращаемое значение этого оператора. Синтаксис тернарного оператора следующий.

result = condition ? first_expression : second_expression;  

что вам не хватает в вашем коде.. Так что вы можете просто выразить это следующим образом..

int k = (i > j) ? i : j;
person Sumit Singh    schedule 22.08.2012