в то время как (0=0) оценивает ко лжи

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

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

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

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

10
задан Andy E 11 June 2010 в 15:08
поделиться

9 ответов

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

21
ответ дан 3 December 2019 в 13:13
поделиться

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

Простым исправлением может быть

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

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

while (true) {
9
ответ дан 3 December 2019 в 13:13
поделиться

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

1
ответ дан 3 December 2019 в 13:13
поделиться

Да, потому что значение присваивания - это то значение, которое присваивается выражению. Это 0, что оценивается как ложное.

4
ответ дан 3 December 2019 в 13:13
поделиться

Цикл While ожидает условия, т.е. while(condition) и имеет дело с true или false. Поэтому ваш цикл выше переводится как while(a), следовательно, условием цикла является значение a.

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

0
ответ дан 3 December 2019 в 13:13
поделиться

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

0
ответ дан 3 December 2019 в 13:13
поделиться
(0 = 0) == 0 == false
29
ответ дан 3 December 2019 в 13:13
поделиться

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

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

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

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

3
ответ дан 3 December 2019 в 13:13
поделиться

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

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

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

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

1
ответ дан 3 December 2019 в 13:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: