Есть ли какая-либо причина, по которой Eclipse показывает переменные присваивания в циклах while как допустимые?

1

Меня много раз пинали во время работы над Java в eclipse, когда я пишу цикл while так:

while (recsFinished = true)

Когда на самом деле я хотел

while (recsFinished == true)

Это довольно простая ошибка, но это случается со мной много, и она полностью отбрасывает программу. И причина в том, что Eclipse даже не выдает предупреждение, когда я пишу назначение, а не уравнение равенства. Это заставляет меня полагать, что должна быть какая-то причина для цикла while с уравнением присваивания, но почему? Я не могу придумать ни единого слова!

  • 6
    Прекратите сравнивать логическое значение с истинным (или ложным), и вам больше не удастся: while (recsFinished)
  • 0
    Ох, это гораздо лучший способ сделать это. Спасибо!
Показать ещё 1 комментарий
Теги:

5 ответов

6
Лучший ответ

Такие присвоения популярны в C и C++ (особенно в if), и также оказались частью Java.

Некоторые люди поставили буквальный while (true == recsFinished) с левой стороны: while (true == recsFinished) вместо этого, и у меня возникает соблазн предположить, что вы принимаете этот стиль программирования только в том, что я лично нахожу его запутывающим. Это приведет к ошибке компилятора, если = используется случайно.

Обратите внимание на то, что сравнение с true является избыточным. Бросьте его полностью и используйте в while (recsFinished).

4

Он компилируется, поскольку он является синтаксисом Java.

Это эквивалентно:

recsFinished = true;
while (recsFinished) {
    ....
    recsFinished = true;
}

Это эквивалентно

recsFinished = true;
while (true) {
    ....
    recsFinished = true;
}

который даст вам бесконечный цикл.

1

Вполне возможно установить значение в выражении вы в цикле. Если вы это сделаете, ваше выражение будет оценено так, чтобы оно всегда истинно, потому что каждый раз, когда вы делаете цикл, вы возвращаете его в true.

0

Чтобы ответить на ваш вопрос; Это верно, потому что спецификация говорит так.

Вы можете вызвать метод с выражением,

15,12. Выражения вызова метода

Выражение вызова метода используется для вызова метода класса или экземпляра.

MethodInvocation:
   MethodName ( ArgumentList opt )

ArgumentList:
   Expression
   ArgumentList , Expression

и присваивание является выражением,

15,26. Операторы присваивания

Существует 12 операторов назначения; все они синтаксически правые ассоциативные (они группируются справа налево). Таким образом, a = b = c означает a = (b = c), который присваивает значение c в b, а затем присваивает значение b значению a.

AssignmentExpression:
   ConditionalExpression
   Assignment
0

В большинстве языков программирования оператор = возвращает назначенное значение после его вызова. 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
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню