Използване на скоби в израз, който включва троичен оператор

Възможен дубликат:
Грешка: 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
Разгледайте отговора на Nawaz в: 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;

Което очевидно не е това, което искате и има проблеми със стойността.

Поправете го с

  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