if (($a = 4 && $a == true) || $a = 5){
var_dump($a);
}
ожидал результатом его выполнения 4
однако, результат 5
Выполнение почему-то начинается с правой части, следовательно в левую даже не заходит.
То, что в левую часть не заходит, можно убедиться на этом примере
if (($a = 4 && $b = 10 && $a == true) || $a = 5){
var_dump($a);
var_dump($b);
}
Почему правая часть выполняется первой?
Спустя 3 минуты, 58 секунд (15.09.2011 - 11:10) caballero написал(а):
потому что там true нет смысла выполнять дальше если стоит ||
Спустя 8 минут, 3 секунды (15.09.2011 - 11:18) Гость_Алексей написал(а):
Вопрос почему выполняется справа налево, а не слева направо
Выполняется слева направо и выведет true и в часть isset($a) зайдет.
Вопрос на самом деле не такой простой, как кажется http://phpforum.ru/style_images/1/icon1.gif
$a=5;
if (isset($a) && $a==5)
{
var_dump($a);
}
Выполняется слева направо и выведет true и в часть isset($a) зайдет.
Вопрос на самом деле не такой простой, как кажется http://phpforum.ru/style_images/1/icon1.gif
Спустя 1 минута, 32 секунды (15.09.2011 - 11:20) Гость_Алексей написал(а):
А мой пример в левую часть не заходит или заходит, но как-то странно
Спустя 8 минут, 53 секунды (15.09.2011 - 11:29) crash написал(а):
да что вы голову морочите? Слева на право, справа на лево. Просто проверьте логику и все будет ок
$a = 4 && $a == true
$a = 4 - это true, поскольку присваивание возвращает положительный результат
$a == true - это false, потому что $a равняется 4, а не true
&& - это знак логического И. Срабатывает только когда оба условия равны true
$a = 4 && $a == true
$a = 4 - это true, поскольку присваивание возвращает положительный результат
$a == true - это false, потому что $a равняется 4, а не true
&& - это знак логического И. Срабатывает только когда оба условия равны true
Спустя 5 минут, 34 секунды (15.09.2011 - 11:34) twin написал(а):
Цитата |
$a == true - это false, потому что $a равняется 4, а не true |
неверно.
А тут дело в приоритетах.
$a = 4;
if($a == true)
echo 'true';
А тут дело в приоритетах.
if ((($a = 4) && ($b = 10) && $a == true) || $a = 5){Вот так надо.
var_dump($a);
var_dump($b);
}
Спустя 10 минут, 14 секунд (15.09.2011 - 11:45) Гость_Алексей написал(а):
Объясняю для Украины :) :) :)
Я ожидаю, что первой выполнится часть ($a = 4 && $a == true). $a = 4 -- это true, $a == true -- это true (4 == true). Следовательно, левая часть true и в правую не пойдет. $a приняло значение 4, вар_дамп выведет 4. На самом деле вар_дамп вывел 5.
Следующий пример
показывает, что левая часть не выполнялась либо вообще либо не дошла до выполнения $b=10, т.к. вар_дамп для $b вернул false. Следовательно, для этого примера мной ожидались $a равным 4, $b равным 10, а получилось $a равно 5 и $b как false.
Вопрос к twin. Почему нужны скобки? Что не так с приоритетами?
if (($a = 4 && $a == true) || $a = 5){
var_dump($a);
}
Я ожидаю, что первой выполнится часть ($a = 4 && $a == true). $a = 4 -- это true, $a == true -- это true (4 == true). Следовательно, левая часть true и в правую не пойдет. $a приняло значение 4, вар_дамп выведет 4. На самом деле вар_дамп вывел 5.
Следующий пример
if (($a = 4 && $b = 10 && $a == true) || $a = 5){
var_dump($a);
var_dump($b);
}
показывает, что левая часть не выполнялась либо вообще либо не дошла до выполнения $b=10, т.к. вар_дамп для $b вернул false. Следовательно, для этого примера мной ожидались $a равным 4, $b равным 10, а получилось $a равно 5 и $b как false.
Вопрос к twin. Почему нужны скобки? Что не так с приоритетами?
Спустя 13 минут, 3 секунды (15.09.2011 - 11:58) twin написал(а):
Потому что скобки приоритетнее. Любое присваивание возвращает true. Вот так у тебя:
И раз условие выполнилось, разбор прекращается.
Если стоят скобки, то нтерпритатор выполняет сначала то, что в скобках, тоесть присваивает значение. И только потом смотрит на получившееся true
if ((true && true && true) || true){
var_dump($a);
var_dump($b);
}
И раз условие выполнилось, разбор прекращается.
Если стоят скобки, то нтерпритатор выполняет сначала то, что в скобках, тоесть присваивает значение. И только потом смотрит на получившееся true
Спустя 7 минут, 53 секунды (15.09.2011 - 12:06) Guest написал(а):
хм. Может немного не понимаю. Да, скобки приоритетнее. Да, присваивание возвращает true. Вернемся тогда к этому примеру.
$a = 4 -- true
$a == true -- true
($a = 4 && $a == true) -- true, $a пока еще == 4
Следовательно эта часть выражения уже вернула true и заходить в часть после || смысла нет (|| $a = 5). Так почему же $a становится 5??? Должно ведь остаться 4.
if (($a = 4 && $a == true) || $a = 5){
var_dump($a);
}
$a = 4 -- true
$a == true -- true
($a = 4 && $a == true) -- true, $a пока еще == 4
Следовательно эта часть выражения уже вернула true и заходить в часть после || смысла нет (|| $a = 5). Так почему же $a становится 5??? Должно ведь остаться 4.
Спустя 13 минут, 40 секунд (15.09.2011 - 12:19) twin написал(а):
Нет, не так. Присваивание идет в последнюю очередь. Пошагово. Я сам запутался)))
Сначала это (скобки - приоритет):
(true && false)
потому что $a еще не инициализирована, а значит не равна true.
Потом правый блок, там присваивание. Возвращает true.
На этом разбор прекращается.
А если со скобками, то сначала идет присваивание, потом сравнение с true. И тогда получается
(true && true)
и в правый блок мы не идем за ненадобностью. Поэтому остается 4.
Сначала это (скобки - приоритет):
(true && false)
потому что $a еще не инициализирована, а значит не равна true.
Потом правый блок, там присваивание. Возвращает true.
На этом разбор прекращается.
А если со скобками, то сначала идет присваивание, потом сравнение с true. И тогда получается
(true && true)
и в правый блок мы не идем за ненадобностью. Поэтому остается 4.
Спустя 17 минут, 58 секунд (15.09.2011 - 12:37) Guest написал(а):
На самом деле остается не 4, а 5
Максимально упрощая этот пример, получил такое
внутрь ифа не заходит
Почему?
Если написать как
то зайдет
Максимально упрощая этот пример, получил такое
if ($a = 4 && $a == 4){
var_dump($a);
}
внутрь ифа не заходит
Почему?
Если написать как
if (($a = 4) && $a == 4){
var_dump($a);
}
то зайдет
Спустя 12 минут, 22 секунды (15.09.2011 - 12:50) twin написал(а):
Ну так потому что присваивание - всегда true. Получили true- достаточно. А само присваивание будет после. Интепретация прекращается по выполнению условий. Поэтому нужно расставить приоритеты. Сначала присвоить (в скобках), потом взять результат.
Спустя 39 минут, 28 секунд (15.09.2011 - 13:29) Гость_Алексей написал(а):
после чего?
Если после скобок либо ифа, то тогда напишем такую конструкцию:
Результатом будет фолс
Выполнится $a = 4 (тру), $a == 4 вернет фолс. После этого должно сработать отложенное присваивание, так? Почему же тогда фолс, а не 4 результат?
Если после скобок либо ифа, то тогда напишем такую конструкцию:
if ($a = 4 && $a == 4){}
var_dump($a);
Результатом будет фолс
Выполнится $a = 4 (тру), $a == 4 вернет фолс. После этого должно сработать отложенное присваивание, так? Почему же тогда фолс, а не 4 результат?
Спустя 15 минут, 26 секунд (15.09.2011 - 13:45) twin написал(а):
Цитата |
Выполнится $a = 4 (тру) |
Не выполнится, в том все и дело. Это кагбэ намерение. Оно всегда true. А выполняется после сравнений.
Вот так сработает:
а так нет:
Вот так понятнее должно быть:
Вот так сработает:
if ($a = 4){}
var_dump($a);
а так нет:
if ($a = 4 && false){}потому что для if уже все ясно, продолжать он не будет. Назад он не ходит.
var_dump($a);
Вот так понятнее должно быть:
if ($a = 4 && true){}
var_dump($a); //true
if (($a = 4) && true){}
var_dump($a);// 4
Спустя 9 минут, 30 секунд (15.09.2011 - 13:54) Guest написал(а):
ок
сл. вопрос :)
почему тогда
Нигде ведь нет явного присваивания $a ?
сл. вопрос :)
почему тогда
if ($a = 4 && true){}
var_dump($a); //true
if ($a = 4 && false){}
var_dump($a); //false
Нигде ведь нет явного присваивания $a ?
Спустя 1 минута, 7 секунд (15.09.2011 - 13:55) Guest написал(а):
Все, я понял. Спасибо за ответ