za4me
@za4me
Человек

Логика и/или в while php?

Добрый день. Не совсем понимаю логику и/или в данном цикле while:
$a = 100;
$b = 50;
while ($a || $b != 0) {
	$a = $a - 10;
	$b = $b - 10;
	echo "a = $a <br>";
	echo "b = $b <br>";
}


Немного псевдокода:
Повторять действия пока $a или $b не станет = 0.
$b станет = 0 раньше чем $a и по идее цикл должен остановится т.к. $b = 0. Но он продолжается, и я не совсем пойму почему.

Если вместо ИЛИ ставлю И (повторять действия пока $a и $b станет = 0), то выполнение корректно, хотя это немного не логично и мне кажется должно быть наоборот.
  • Вопрос задан
  • 191 просмотр
Решения вопроса 1
qonand
@qonand
Software Engineer
в условие $a || $b != 0 сначала проверяется условие по $a и если оно возвращает true выполняется тело цикла, условие $b != 0 при этом даже не проверяется. Если же условие $a возвращает false - только тогда происходит проверка условия $b != 0. Это стандартная логика условия ИЛИ в php
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@IceJOKER
Web/Android developer
у вас там логика такая:
повторять пока $a истинно ИЛИ $b != 0
Ответ написан
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Почитайте про порядок выполнения операндов.
если что то не понятно - используйте

var_dump($a == true);
var_dump($b != 0);
var_dump($a || $b != 0);

на каждом шаге
Ответ написан
Комментировать
qork
@qork
{ background: #F00B42 }
Ошибка здесь:
Повторять действия пока $a или $b не станет = 0.

Выполнять пока $a или ($b !=0) true

На пятой итерации цикла
a = 50
b = 0
значит идём дальше

На десятой итерации цикла
a = 0
b = -50 (true)
значит идём дальше

Может поставить условия $a != 0 || $b != 0
Ответ написан
Комментировать
@novrm
Сделайте так:
while (($a*$b) !== 0) {
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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