Подтвердить что ты не робот

Тип-литье в булево

Может кто-нибудь объяснить мне, почему это:

var_dump((bool) 1==2);

возвращает

bool(true)

но

var_dump(1==2);

возвращает

bool(false)

Конечно, второе возвращение верно, но почему в первый раз php возвращает неожиданное значение?

4b9b3361

Ответ 1

На самом деле это не так странно. (bool) имеет более высокий приоритет, чем ==, так что:

var_dump((bool) 1==2);

эквивалентно этому:

var_dump(  ((bool) 1)   == 2);

или это:

var_dump(true == 2);

Из-за типа жонглирования, 2 также по существу получает отличное от bool (так как это "свободное сравнение" ) поэтому он эквивалентен этому:

var_dump(true == true);

или это:

var_dump(true);

Ответ 2

Потому что в первом примере литье происходит перед сравнением. Так что, как будто вы написали

((bool) 1)==2

что эквивалентно

true == 2

который вычисляется путем преобразования 2 в true и сравнения, в конечном итоге производя true.

Чтобы увидеть ожидаемый результат, вам нужно добавить parens, чтобы сделать порядок явным:

var_dump((bool)(1==2));

Посмотрите на действие.

Ответ 3

Я использую этот способ:

!!0 (false)
!!1 (true)

Ответ 4

То, как вы написали оператор ((bool) 1 == 2), всегда будет возвращать true, потому что он всегда будет выполнять код, как показано ниже:

Сначала он выполнит

(bool)1

и (bool) 1 вернет true.

Теперь, когда (bool) 1 на втором шаге будет истинным, ваш оператор будет выглядеть как

true ==2

Так как если мы будем выводить 2 в boolean, он вернет true, в конечном состоянии ваш оператор будет выглядеть как

true == true

Что, очевидно, вернет true. То же самое, что я объяснил год назад в своем сообщении PHP Type casting.