Побитовое И (&) выражение в Java - PullRequest
1 голос
/ 27 июля 2010

Я отлаживаю код, который содержит expr1 & expr2, где expr1 имеет побочный эффект, который влияет на expr2 результат оценки. Я подозреваю, что expr2 оценивается до expr1, поскольку JLS гарантирует оценку слева направо для &&, но не обязательно для &. Я также подозреваю, что изменение порядка оценки может быть результатом оптимизации, выполненной HotSpot (у нас работает Java 6u20). Вы знаете, может ли HotSpot провести такую ​​оптимизацию? А еще лучше, предоставить любые указатели на документацию, которая либо поддерживает, либо устраняет подозрение. Заранее спасибо.

РЕДАКТИРОВАТЬ: Спасибо за те, кто предлагает переписать код, чтобы он был и корректным, и читабельным - вы правы, но я уже сделал, так что это не то, что я ищу. К сожалению, это трудно проверить изменения, поэтому я задаю вопрос здесь.

Ответы [ 2 ]

6 голосов
/ 27 июля 2010

Порядок оценки четко определен в спецификации :

Язык программирования Java гарантирует, что операнды операторов, по-видимому, вычисляются в определенном порядке вычисления, а именно слева направо.

Оптимизатор HotSpot не должен выполнять оптимизацию, которая приводит к оценке expr2 перед expr1, если это меняет результат. Если это так, то это ошибка.

Обратите внимание, что там написано:

Рекомендуется, чтобы код не полагался в решающей степени на эту спецификацию.

Ваш код может быть переписан более четко следующим образом:

int a = expr1;
int b = expr2;
int result = a & b;
1 голос
/ 27 июля 2010

JLS 3-е издание, раздел 15.7, говорит о порядке оценки слева направо, но просит не полагаться на него критически (кроме коротких замыканий)

...