2010-07-27 3 views
1

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

EDIT: Спасибо, что предложили переписать код, чтобы он был правильным и читаемым - вы правы, но я уже сделал это, поэтому я не ищу этого. К сожалению, трудно проверить изменения, поэтому я задаю здесь вопрос.

+1

Почему бы не включить 'if (A() & B())' в 'boolean a = A(); boolean b = B(); if (a & b) ', чтобы проверить, устраняет ли это проблему? – Mike

+0

Что заставляет вас думать, что слева направо не гарантируется поразрядное? Единственное различие, которое я могу найти в спецификации, заключается в том, что для поразрядного выражения 'expr2' гарантированно оценивается, но для логики он будет закорочен, но в любом случае он всегда будет L-> R, и что' Оператор expr1' будет оцениваться перед любой частью 'expr2'. – Joe

+0

http://download-llnw.oracle.com/javase/tutorial/java/nutsandbolts/operators.html заявляет, что все двоичные операторы, кроме присваивания, оценивают слева направо. – Joe

ответ

6

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

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

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

Отметим также, что говорит:

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

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

int a = expr1; 
int b = expr2; 
int result = a & b; 
1

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

Смежные вопросы