[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с if и присваиваниями
Гость_Алексей
есть код

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) Гость_Алексей написал(а):
Вопрос почему выполняется справа налево, а не слева направо

$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) Гость_Алексей написал(а):
А мой пример в левую часть не заходит или заходит, но как-то странно smile.gif

Спустя 8 минут, 53 секунды (15.09.2011 - 11:29) crash написал(а):
да что вы голову морочите? Слева на право, справа на лево. Просто проверьте логику и все будет ок
$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) Гость_Алексей написал(а):
Объясняю для Украины :) :) :)

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. Вот так у тебя:
if ((true && true && true) || true){
var_dump($a);
var_dump($b);
}

И раз условие выполнилось, разбор прекращается.

Если стоят скобки, то нтерпритатор выполняет сначала то, что в скобках, тоесть присваивает значение. И только потом смотрит на получившееся true

Спустя 7 минут, 53 секунды (15.09.2011 - 12:06) Guest написал(а):
хм. Может немного не понимаю. Да, скобки приоритетнее. Да, присваивание возвращает true. Вернемся тогда к этому примеру.

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.


Спустя 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) Гость_Алексей написал(а):
после чего?
Если после скобок либо ифа, то тогда напишем такую конструкцию:

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){}
var_dump($a);
потому что для if уже все ясно, продолжать он не будет. Назад он не ходит.
Вот так понятнее должно быть:
if ($a = 4 && true){}
var_dump($a); //true

if (($a = 4) && true){}
var_dump($a);// 4

Спустя 9 минут, 30 секунд (15.09.2011 - 13:54) Guest написал(а):
ок
сл. вопрос :)
почему тогда

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 написал(а):
Все, я понял. Спасибо за ответ smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.