2016-12-28 8 views
2

J'ai essayé ce qui suit avec l'opérateur ternaire et je ne comprends pas pourquoi il ne compile pas. Le problème semble si petit mais je ne comprends pas et par conséquent me dérange -erreur de compilation avec l'opérateur ternaire

Ligne 1 -> int a = false? y + = 1: (x * = 10);

Ligne 2 -> int b = false? y + = 1: x * = 10;

Ligne 1 compile cependant Ligne 2 ne fonctionne pas. Pourquoi ? Comment la parenthèse fait-elle une différence dans le cas d'un troisième opérande et non d'un deuxième opérande? Je n'ai pas eu besoin d'utiliser de parenthèses avec quoi que ce soit d'autre dans les opérandes 2nd/3rd (Unaire, string, arithmétique de base ...) Pourquoi juste l'opérateur d'assignation et cela aussi spécifiquement le 3ème opérande?

Merci d'avance!

Répondre

6

Sans () autour x*=10, l'ensemble opérande gauche de l'opérateur *= est false ? y+=1 : x, comme si vous aviez:

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

Et comme false ? y+=1 : x n'est pas une variable, il ne peut pas être la l'opérande gauche de *=.

Les opérateurs d'affectation (y compris l'attribution de composé, *= et autres) sont très, très faible dans le precedence list, au-dessous de l'opérateur conditionnel (? :):

opérateurs Precedence

  • postfixe : expr++ expr--
  • unaire: ++expr --expr +expr -expr ~ !
  • multiplicatif: */%
  • additif: + -
  • changement: << >> >>>
  • relationnelle: < > <= >= instanceof
  • égalité: == !=
  • bitwise: ET &
  • bitwise: OU exclusif ^
  • bitwise: OU inclusif |
  • logique: ET &&
  • logique: OU ||
  • ternaire: ? :
  • mission: = += -= *= /= %= &= ^= |= <<= >>= >>>=
+1

Cela aide, je vous remercie! – Rads