Линия equal &= a1[i] == a2[i];
использует &=
(логико-присваивания) оператор, который является тем же самым как equal = equal & (a1[i] == a2[i]);
. Он объединяет логический и оператор присваивания. Эта строка может быть разобрана так:
bool = (itself) AND (int == int)
bool = (itself) AND (another bool)
bool = (some bool value)
Будьте очень осторожны с оператором &
, так как it has two different meanings. Это означает логическое-И для булевых типов, но побитовое-И для числовых типов. Чтобы сделать его более понятным, используйте equal = equal && a1[i] == a2[i];
, который также имеет верхнюю часть операции короткого замыкания (что может сэкономить несколько ненужных сравнений).
С другой стороны, в этом цикле имеется несколько избыточности.
boolean equal = true;
for (int i = 0; i < a1.length && equal; i++) {
equal &= a1[i] == a2[i];
}
петлевой проверка состояния, что массив все еще имеют элементы и что предыдущий элемент (ы) все совпавшая. Поскольку условие цикла также проверяет логическое значение equal
, нет необходимости использовать оператор соединения и назначения. Простой equal = a1[i] == a2[i];
будет работать и даже сохранить ненужную операцию (true) & (something)
на каждой итерации цикла. Это работает, потому что условие цикла гарантирует, что equal == true
, так как цикл остановит выполнение в противном случае.
http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.14 –