b=10;
while(a=b) {
b--;
if(b==-10)break;
}
B идет от 10 до-10. В моем мире в-то-время-как-оператор, a=b, должен всегда быть верным (так как присвоение всегда "подходит"). Дело не в этом. Когда цикл остановится, b будет иметь значение 0.
В моем мире это должно передать 0 и перейти полностью в-10, когда оператор "if" умирает.
Я неправильно понял что-то главное? (Код протестирован в IE8 и Adobe Acrobat),
Значением присваивания является присваиваемое значение, поэтому можно составить цепочку присваиваний a=b=2
, например, когда b=0
, значение a=b
равно 0.
0
является ложным значением, 0 == false
истинно, поэтому, как только b достигает 0, тогда a = b оценивается как false и цикл перерывы.
Простым исправлением может быть
while ((a=b) > -10) {
или, в этом случае, из-за оператора break;
вы могли бы просто использовать
while (true) {
0 является ложным в javascript, a = b возвращает 0, когда b достигает 0, поэтому javascript читает false.
Да, потому что значение присваивания - это то значение, которое присваивается выражению. Это 0, что оценивается как ложное.
Цикл While ожидает условия, т.е. while(condition) и имеет дело с true или false
.
Поэтому ваш цикл выше переводится как while(a)
, следовательно, условием цикла является значение a.
Когда a
достигнет 0, цикл прервется.
На самом деле 0 = 0 даст результат 0, который интерпретируется как false. Другими словами while(0=0) практически то же самое, что while(0), что разрывает цикл.
Очевидно, что if(0) эквивалентно if(false).
Так, if(a=b) истинно только в том случае, если b равно чему-то, что станет истинным при приведении к булеву числу.
Так, если, скажем, a и b одного типа, то это будет считаться истинным, если b ненулевое.
Что я не понимаю, так это почему этот код?
оператор while, a = b, всегда должен быть истинным (поскольку присваивание всегда «идет хорошо»).
Обычно не рекомендуется рассматривать возвращаемое значение как подтверждение успеха операции. Продолжение выполнения вашего кода свидетельствует о том, что задание прошло успешно.
Примечательно, что ваша интуиция на самом деле отстает от стандарта в сценариях оболочки Unix, где 0
означает A-OK!
и ненулевое значение указывает на другой результат.
Теперь, когда такие вещи, как исключения, могут использоваться для обозначения проблемы в выполнении, есть более эффективные механизмы, которые можно использовать для этого.