как этот троичный оператор работает с этим состоянием?

#java #compiler-errors #conditional-operator #boolean-expression

#java #ошибки компилятора #условный оператор #логическое выражение

Вопрос:

я просто генерирую этот метод, чтобы найти максимальное значение в некоторой матрице, и каким-то образом я смог изменить int значение в троичном операторе (java 8)

 int  max=0, indexToReturn=0;
        int size= arr[0].length;
        for (int i=1 ; i < size ; i  )
        {
            //
            //                                                 ¯_(ツ)_/¯
            max =  (!(arr[j][indexToReturn] > arr[j][i])) ? indexToReturn= i : arr[j][indexToReturn] ;
        }
     return max > 0 ||  indexToReturn==size-1 ? arr[j][indexToReturn] : null;
 

(метод компилируется и работает)

я не совсем уверен, Эван, как его компилировать из того, что я видел в Интернете синтаксис троичного оператора :

 variable = Expression1 ? Expression2: Expression3
 

может кто-нибудь объяснить мне, чего мне здесь не хватает?

Ответ №1:

Причина, по которой это работает, заключается в том, что присваивание является выражением. Значение присваивания — это присвоенное значение. Это звучит теоретически, поэтому давайте рассмотрим пример:

 int i, k;
i = (k = 5);
System.out.println(i);
System.out.println(k);
 

Ideone demo

Значением выражения k = 5 является присвоенное значение 5 . Затем это значение присваивается i .

Вооружившись этими знаниями, мы видим, что indexToReturn= i это выражение, которое вычисляется до значения i . Когда мы меняем Expression2 местами и Expression3 , троичный оператор прерывается, потому = i что не вычисляется как часть троичного оператора (из-за приоритета оператора). Если мы установим круглые скобки Expression2 , все будет работать так, как ожидалось.


Я бы не рекомендовал использовать тот факт, что присваивание является выражением. (Ab) использование этого факта часто приводит к трудному для понимания коду.