2016-12-28 12 views
2

Я попробовал следующее с тройным оператором, и я не понимаю, почему он не компилируется. Проблема кажется такой маленькой, но я не понимаю и, следовательно, беспокоит меня -ошибка компиляции с тройным оператором

Линия 1 -> int a = false? y + = 1: (x * = 10);

Линия 2 -> int b = false? y + = 1: x * = 10;

Линия 1 компилирует однако Строка 2 нет. Зачем ?

Как скобки делают разницу в случае третьего операнда, а не второго операнда. Мне не нужно было использовать круглые скобки с чем-либо еще во 2-м/3-ом операндах (Unary, string, basic arithmetic ...) Почему просто оператор присваивания и это слишком специфический 3-й операнд?

Заранее благодарен!

ответ

6

() Без вокруг x*=10, весь левый операнд оператора *= является false ? y+=1 : x, как если бы вы были:

int b = (false ? y+=1 : x)*=10; 

И как false ? y+=1 : x не является переменной, она не может быть левый операнд *=.

Операторы присваивания (в том числе присвоение соединения, *= и такое) очень, очень низко в precedence list, ниже условного оператора (? :):

Операторы старшинства

  • постфикса : expr++ expr--
  • унарные: ++expr --expr +expr -expr ~ !
  • мультипликативный: */%
  • добавка: + -
  • сдвиг: << >> >>>
  • реляционная: < > <= >= instanceof
  • равенство: == !=
  • побитовое: И &
  • побитовое: исключающее ИЛИ ^
  • побитовое: включено ИЛИ |
  • логична: И &&
  • логична: ИЛИ ||
  • тройная: ? :
  • Назначение: = += -= *= /= %= &= ^= |= <<= >>= >>>=
+1

Это помогает, спасибо! – Rads

 Смежные вопросы

  • Нет связанных вопросов^_^