Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Что выведет скрипт?
 
 автор: partizan   (01.03.2006 в 20:04)   письмо автору
 
 

Что может вывести такой код:



$x=some_function();
if ($x==-1)
 echo "$x = -1";

   
 
 автор: codexomega   (01.03.2006 в 20:43)   письмо автору
 
   для: partizan   (01.03.2006 в 20:04)
 

А к чему такой вопрос?

   
 
 автор: partizan   (01.03.2006 в 20:47)   письмо автору
 
   для: codexomega   (01.03.2006 в 20:43)
 

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

1 = -1

   
 
 автор: midav   (01.03.2006 в 22:22)   письмо автору
 
   для: partizan   (01.03.2006 в 20:47)
 

ну так по такому скрипту так и должно быть :)

   
 
 автор: cheops   (01.03.2006 в 22:49)   письмо автору
 
   для: partizan   (01.03.2006 в 20:47)
 

Хм... странно... а нет возможности вывести значение
<?php
 
echo ($x==-1);
?>

а также занчение $x.

   
 
 автор: Trianon   (02.03.2006 в 10:27)   письмо автору
 
   для: partizan   (01.03.2006 в 20:47)
 

 echo "\$x=$x";   

   
 
 автор: cheops   (02.03.2006 в 12:48)   письмо автору
 
   для: Trianon   (02.03.2006 в 10:27)
 

Штука в том, что условие if ($x==-1) не должно при таком раскладе срабатывать...

   
 
 автор: partizan   (02.03.2006 в 16:23)   письмо автору
 
   для: cheops   (02.03.2006 в 12:48)
 

А оно-то какраз срабатывает, при значении x=true

   
 
 автор: Drago   (02.03.2006 в 18:44)   письмо автору
 
   для: partizan   (02.03.2006 в 16:23)
 

Какого типа у вас переменная $x? Boolean (логическая)? Если да, то все правильно. Так как, значение false <=> 0, а true - любому другому числу, как неотрицательному так и отрицательному.

   
 
 автор: Trianon   (02.03.2006 в 19:35)   письмо автору
 
   для: Drago   (02.03.2006 в 18:44)
 

Поскольку тип второго аргумента в бинарных операциях приводится к типу первого. и тут всё ясно...
А вот почему булев тип при приведении к строке (при работе echo в частности) преобразуется таким странным образом?
     false => ''                 true  => '1'         


А почему собственно....
По мануалу.http://ru.php.net/manual/ru/language.types.string.php#language.types.string.casting

   
 
 автор: Drago   (02.03.2006 в 19:54)   письмо автору
 
   для: Trianon   (02.03.2006 в 19:35)
 

Если использовать для сравнения оператор "==", то типы переменных не учитываются. И false == 0, так же как false == "", также как 0 == "". Чтобы учитывался тип переменных, нужно использовать оператор сравнения "===".

   
 
 автор: Trianon   (02.03.2006 в 20:18)   письмо автору
 
   для: Drago   (02.03.2006 в 19:54)
 

Со сравнением все верно. Есть мягкое - сравнивает приведенные значения, есть жесткое - разные типы считает неравными значениями.
А в строке echo "$x = -1"; которая, собственно, и печатает анафему, только преобразование.
Конечно, мануал мануалом, но откровенно говоря, мне все еще неясно, почему разработчики PHP решили преобразовывать булев тип в строку так странно.
echo array(1,2,3); печатает Array, а echo 2*2 != 4; почему-то false печатать не хочет.

   
 
 автор: cheops   (02.03.2006 в 22:42)   письмо автору
 
   для: Trianon   (02.03.2006 в 20:18)
 

Почему странно, испокон веку true в 1 преобразуется, а false в 0. Сами константы true и false сравнительно недавно появились в программировании, например, в C их вообще нет - вместо них используется 1 и 0.

   
 
 автор: Trianon   (02.03.2006 в 22:52)   письмо автору
 
   для: cheops   (02.03.2006 в 22:42)
 

Если б false в 0 преобразовывалось, я бы и не пыхтел. Но оно же преобразуется в пустую строку!
Собственно, чем вызван вопрос-то. Хочется понять логику разработчиков. Тогда легче будет запомнить поведение.
Спокон веку тоже понятие относительное. Или имеется в виду 21 век? :)
В Фортране, (во всех ходовых реализациях) true преобразовывалось (точнее представлялось) в -1 (слово, набитое единицами). В форте, если память не изменяет, тоже. В алголе, паскале и прочих языках строгой типизации такие фортели были вообще запрещены.
В Си - да. Единица. Замечательное красивое логичное решение. Ну уж потом С++, Java и понеслось.
НО! Везде понятна логика! А в варианте true печатаем единичкой, false не печатаем вообще я, например, логики не вижу.

   
 
 автор: isset   (02.03.2006 в 23:28)   письмо автору
 
   для: Trianon   (02.03.2006 в 22:52)
 

Что здесь странного?
var_dump(2*2 != 4);

   
 
 автор: Trianon   (03.03.2006 в 10:22)   письмо автору
 
   для: isset   (02.03.2006 в 23:28)
 

Ну... если так формулировать..... Хорошо. Тогда странно то , что
<?php function my_var_dump($v) { $t gettype($v); echo "$t($v)" 
my_var_dump(2*!=4); my_var_dump(2*2==4); ?>
и
<?php var_dump(2*!=4); var_dump(2*2==4); ?>
дают, мягко говоря, разный отклик.

   
 
 автор: Drago   (03.03.2006 в 00:45)   письмо автору
 
   для: Trianon   (02.03.2006 в 22:52)
 

>Если б false в 0 преобразовывалось, я бы и не пыхтел. Но оно же преобразуется в пустую строку!
Ну так и праывильно. если строка пустая, значит она не имеет значения. А раз она не имеет значения, значит равносильно нулю, то есть false.

   
 
 автор: cheops   (03.03.2006 в 14:19)   письмо автору
 
   для: Trianon   (02.03.2006 в 22:52)
 

>НО! Везде понятна логика! А в варианте true печатаем
>единичкой, false не печатаем вообще
я, например, логики
>не вижу.
Есть такое дело, это тараканы PHP, он действительно пустой строкой представляет false.

   
 
 автор: isset   (02.03.2006 в 23:26)   письмо автору
 
   для: partizan   (01.03.2006 в 20:04)
 

http://ru2.php.net/boolean

Внимание

-1 считается TRUE, как и любое ненулевое (отрицательное или положительное) число! 

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования