While (0 = 0) оценивается как false

b=10;
while(a=b) {
  b--;
  if(b==-10)break;
}

B идет от 10 до -10. В моем мире утверждение while, a = b, всегда должно быть истинным (поскольку привязка всегда "идет хорошо" ). Это не относится к делу. Когда цикл остановится, b будет иметь значение 0.

В моем мире он должен пройти 0 и пройти весь путь до -10, когда выполняется if-statement.

Я неправильно понял что-то важное? (Код протестирован в IE8 и Adobe Acrobat)

Ответ 1

Значение присваивания - это назначаемое значение, поэтому вы можете назначить назначения a = b = 2, например, поэтому, когда b=0, значение a=b равно 0.

Ответ 2

(0 = 0) == 0 == false

Ответ 3

0 - значение false, 0 == false - true, поэтому, как только b достигает 0, тогда a = b вычисляет значение false и цикл прерывается.

Простое исправление будет

while ((a=b) > -10) {

или в этом случае из-за оператора break; вы можете просто использовать

while (true) {

Ответ 4

Да, поскольку значение присваивания - это значение, которое присваивается выражению. Который равен 0, который вычисляется как false.

Ответ 5

Очевидно, если (0) эквивалентно if (false).

Итак, если (a = b) истинно, только если b равно чему-то, что станет истинным, если бросить в boolean.

Итак, если говорят, что a и b - это один и тот же тип, он будет считаться истинным, если b отличен от нуля.

Что я не понимаю, почему этот код?

Ответ 6

0 является ложным в javascript, a = b возвращает 0, когда b достигает 0, поэтому javascript читает false.

Ответ 7

while-statement, a = b, всегда должен быть истинным (поскольку присвоение всегда "идет хорошо" ).

Как правило, не рекомендуется думать о возвращаемом значении в качестве подтверждения успеха операции. Продолжающееся выполнение вашего кода является признаком того, что присвоение прошло хорошо.

Примечательно, что ваша интуиция на самом деле назад из стандартного сценария оболочки Unix, где 0 означает A-OK!, а ненулевой - другой результат.

Теперь, когда такие вещи, как Исключения, могут указывать на проблему при выполнении, для этого существуют более эффективные механизмы.

Ответ 8

В то время как цикл ожидает условие i.e while (условие) и имеет дело с true or false Поэтому ваш цикл выше переводит на while(a) ergo условие для цикла - это значение a.

Когда a достигает 0, ваш цикл прерывается.

Ответ 9

Фактически 0 = 0 даст вам результат 0, который интерпретируется как false. Другими словами while (0 = 0) в значительной степени совпадает с while (0), который прерывает цикл.