#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);
Значением выражения k = 5
является присвоенное значение 5
. Затем это значение присваивается i
.
Вооружившись этими знаниями, мы видим, что indexToReturn= i
это выражение, которое вычисляется до значения i
. Когда мы меняем Expression2
местами и Expression3
, троичный оператор прерывается, потому = i
что не вычисляется как часть троичного оператора (из-за приоритета оператора). Если мы установим круглые скобки Expression2
, все будет работать так, как ожидалось.
Я бы не рекомендовал использовать тот факт, что присваивание является выражением. (Ab) использование этого факта часто приводит к трудному для понимания коду.