Как Java оценивает это утверждение?
У меня есть это выражение в операторе if else
if (row % 2 == 0 && col % 2 == 0 || row % 2 == 1 && col % 2 == 1) {
return 0;
}
else {
return 1;
}
который ведет себя как задумано, возвращая 0, когда строка и столбец либо четные, либо нечетные. Что меня озадачивает, так это то, что Java не читала это как
(row % 2 == 0 && (col % 2 == 0 || row % 2 == 1 && col % 2 == 1))
Как именно Java оценивает оператор без скобок?
2 ответа
Как именно Java читает оператор без скобок?
Применяя правила приоритета оператора. Спецификация языка Java говорит, что &&
имеет более высокий приоритет, чем ||
и это означает, что:
row % 2 == 0 && col % 2 == 0 || row % 2 == 1 && col % 2 == 1
эквивалентно:
(row % 2 == 0 && col % 2 == 0) || (row % 2 == 1 && col % 2 == 1)
И на самом деле, ==
имеет более высокий приоритет, чем &&
, так что это эквивалентно:
((row % 2 == 0) && (col % 2 == 0)) || ((row % 2 == 1) && (col % 2 == 1))
Эта страница из Учебного руководства по Java предоставляет больше информации о приоритетах операторов и о том, как это влияет на оценку выражений
Что бы это ни стоило, существует естественная параллель между приоритетом оператора в языке программирования и значением простых арифметических выражений... как вас учили в начальной школе. Например, вас учили, что 1 + 2 x 3
означает то же самое, что и 1 + (2 x 3)
; т.е. ответ 7
и не 9
, В техническом плане x
(умножение) оператор имеет более высокий приоритет, чем +
(дополнение) оператор.
Идея та же, что и в типичном языке программирования, за исключением того, что существует более широкий диапазон операторов, с которыми нужно иметь дело... и правила (вообще говоря) более точно определены1.
1 - Например, поскольку оценка основных цветов и операторов может в некоторых случаях иметь побочные эффекты, может быть важно знать точный порядок, в котором оцениваются подвыражения.
Это из-за порядка приоритета. &&
имеет приоритет над ||
,
Посмотри здесь