Я отлаживаю код, который имеет в нем expr1 & expr2
, где expr1
имеет побочный эффект, который влияет на результат оценки expr2
. Я подозреваю, что expr2
оценивается до expr1
, поскольку JLS гарантирует оценку слева направо для &&
, но не обязательно для &
. Я также подозреваю, что изменение порядка оценки может быть результатом оптимизации, выполняемой HotSpot (мы запускаем Java 6u20). Знаете ли вы, может ли HotSpot сделать такую оптимизацию? Еще лучше, укажите любые указатели на документацию, которые поддерживают или устраняют подозрение. Заранее спасибо.Побитовое И (&) выражение в Java
EDIT: Спасибо, что предложили переписать код, чтобы он был правильным и читаемым - вы правы, но я уже сделал это, поэтому я не ищу этого. К сожалению, трудно проверить изменения, поэтому я задаю здесь вопрос.
Почему бы не включить 'if (A() & B())' в 'boolean a = A(); boolean b = B(); if (a & b) ', чтобы проверить, устраняет ли это проблему? – Mike
Что заставляет вас думать, что слева направо не гарантируется поразрядное? Единственное различие, которое я могу найти в спецификации, заключается в том, что для поразрядного выражения 'expr2' гарантированно оценивается, но для логики он будет закорочен, но в любом случае он всегда будет L-> R, и что' Оператор expr1' будет оцениваться перед любой частью 'expr2'. – Joe
http://download-llnw.oracle.com/javase/tutorial/java/nutsandbolts/operators.html заявляет, что все двоичные операторы, кроме присваивания, оценивают слева направо. – Joe