Меня много раз пинали во время работы над Java в eclipse, когда я пишу цикл while так:
while (recsFinished = true)
Когда на самом деле я хотел
while (recsFinished == true)
Это довольно простая ошибка, но это случается со мной много, и она полностью отбрасывает программу. И причина в том, что Eclipse даже не выдает предупреждение, когда я пишу назначение, а не уравнение равенства. Это заставляет меня полагать, что должна быть какая-то причина для цикла while с уравнением присваивания, но почему? Я не могу придумать ни единого слова!
Такие присвоения популярны в C и C++ (особенно в if
), и также оказались частью Java.
Некоторые люди поставили буквальный while (true == recsFinished)
с левой стороны: while (true == recsFinished)
вместо этого, и у меня возникает соблазн предположить, что вы принимаете этот стиль программирования только в том, что я лично нахожу его запутывающим. Это приведет к ошибке компилятора, если =
используется случайно.
Обратите внимание на то, что сравнение с true
является избыточным. Бросьте его полностью и используйте в while (recsFinished)
.
Он компилируется, поскольку он является синтаксисом Java.
Это эквивалентно:
recsFinished = true;
while (recsFinished) {
....
recsFinished = true;
}
Это эквивалентно
recsFinished = true;
while (true) {
....
recsFinished = true;
}
который даст вам бесконечный цикл.
Вполне возможно установить значение в выражении вы в цикле. Если вы это сделаете, ваше выражение будет оценено так, чтобы оно всегда истинно, потому что каждый раз, когда вы делаете цикл, вы возвращаете его в true.
Чтобы ответить на ваш вопрос; Это верно, потому что спецификация говорит так.
Вы можете вызвать метод с выражением,
15,12. Выражения вызова метода
Выражение вызова метода используется для вызова метода класса или экземпляра.
MethodInvocation: MethodName ( ArgumentList opt ) ArgumentList: Expression ArgumentList , Expression
и присваивание является выражением,
Существует 12 операторов назначения; все они синтаксически правые ассоциативные (они группируются справа налево). Таким образом, a = b = c означает a = (b = c), который присваивает значение c в b, а затем присваивает значение b значению a.
AssignmentExpression: ConditionalExpression Assignment
В большинстве языков программирования оператор =
возвращает назначенное значение после его вызова. whcih означает, что если вы хотите назначить переменную на каждой итерации, а значение этой переменной - это условие, то вы будете использовать =
в условии цикла вместо ==
пример
boolean a, b;
b = true;
while(a = b){
// Some crazy things using a & b
// loop ends when b == false at the end of an iteration
}
while (recsFinished)