2015-03-17 3 views
-1

Может ли кто-нибудь объяснить мне на словах, что именно означает код после 'for'? Я путаюсь с смешиванием int и boole в пределах 'for' (еще новичок). Речь идет о проверке того, имеют ли два массива одинаковые значения в одной и той же последовательности. Заранее спасибо:For-Loop and Arrays Java

public static boolean equal(int[] a1, int[] a2) { 
if (a1.length != a2.length) { 
return false; 
} boolean equal = true; 
for (int i = 0; i < a1.length && equal; i++) { 
equal &= a1[i] == a2[i]; 
} 
return equal; 
} 
+0

http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.14 –

ответ

1

для цикла состоит из 4-х частей:

for(initialisation; condition; increment/decrement) { 
    body 
} 

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

Состояние это логическое выражение, которое, если оценивается истинные результаты в исполнении тела.

Приращение/декремент - это то, где вы можете изменить значение любой переменной в области цикла.

Все 3 части после того, как для ключевого слова не являются обязательными, так что вы можете создать бесконечный цикл, как показано ниже:

for(;;) { 
System.out.println("body"); 
} 
0

Линия 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, так как цикл остановит выполнение в противном случае.