Как 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 - Например, поскольку оценка основных цветов и операторов может в некоторых случаях иметь побочные эффекты, может быть важно знать точный порядок, в котором оцениваются подвыражения.

Это из-за порядка приоритета. && имеет приоритет над ||,

Посмотри здесь

Другие вопросы по тегам