2016-07-24 3 views

ответ

1

Ваш код не содержит круглых скобок вокруг назначений.

компилируется и работает правильно:

int a = 20, b = -1, c = -1; 
a<=20? (b=10) : (c=30); 
printf("b=%d, c=%d\n", b, c); 

Demo.

Примечание: Само собой разумеется, что такие (MIS) использование троичного оператора отрицательно влияет на читаемость кода, и должны следует избегать в пользу обычного заявления if.

6

Это происходит потому, что условный оператор имеет более высокий приоритет, чем оператор присваивания и выражение интерпретируется как

((a<=20)? (b=10) : c)=30; 

Что возвращается из условного оператора не именующий (N1570 6.5.15, сноска 110), таким образом, программа выдаст ошибку компиляции.

Вы можете использовать круглые скобки для преодоления этой проблемы с приоритетом.

a<=20? (b=10) : (c=30); 

Использование обычной if заявление должно быть лучше, если у вас есть какие-то причины, как:

  • Выполнение кода в гольф
  • Попытка сделать программу трудно читать
  • Хотите использовать то, что возвращается из выражения
if (a <= 20) { 
    b = 10; 
} else { 
    c = 30; 
} 
Смежные вопросы