ошибка компиляции с тернарным оператором

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

Строка 1 --> int a = false ? у+=1 : (х*=10);

Строка 2 --> int b = false ? у+=1 : х*=10;

Строка 1 компилируется, а Строка 2 — нет. Почему ?

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

Заранее спасибо !


person Rads    schedule 28.12.2016    source источник


Ответы (1)


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

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

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

Операторы присваивания (включая составное присваивание, *= и т. д.) очень и очень мало представлены в список приоритетов, под условным оператором (? :):

Приоритет операторов

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