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

Форум PHP

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

 

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

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

тема: Операторы сравнения
 
 автор: ДобрыйУхх   (15.01.2010 в 17:43)   письмо автору
 
 

Здравствуйте, кто нибудь может прояснить правила по которым выражение приводится к тому или иному контексту?


в этом выражении

if (false == "") echo "странно - печатает";


Сначала "" преобразуется в 0 и получается контекст числовой, затем 0 преобразуется в false и контекст логический? Ход рассуждений правильный?

и второй вопрос

$ten = 10;
if ($ten == 1) echo "не печатает"; 

константа приводиться к числовому контексту или они оба к логическому?

  Ответить  
 
 автор: heed   (15.01.2010 в 19:30)   письмо автору
 
   для: ДобрыйУхх   (15.01.2010 в 17:43)
 

>if (false == "")

FALSE это один байт 0x00
Конец строки тоже 0x00

Данные которые содержат байт 0x00 нельзя обработать строковыми функциями
, потомучто 0x00 будет принят за конец строки

а там кто его знает какими инструкциями обрабатывают бинарники php
test 0x00, 0x00
или
cmp 0x00, 0x00


//upd

Вообщето вроде текст в UTF-8 или ненормализованое его представление допускает присутствие NULL-байтов
тогда символами конца строки бывают два NULL-байта подряд.
В представлении некоторых структур точно такое есть.

  Ответить  
 
 автор: 3423423   (15.01.2010 в 21:44)
 
   для: heed   (15.01.2010 в 19:30)
 

>FALSE это один байт 0x00
>Конец строки тоже 0x00
>
>Данные которые содержат байт 0x00 нельзя обработать строковыми функциями
>, потомучто 0x00 будет принят за конец строки
>
>а там кто его знает какими инструкциями обрабатывают бинарники php
> test 0x00, 0x00
>или
>cmp 0x00, 0x00
>
>

Ответ неверный. В яслях будешь крутость показывать.

2 ТС: в мануале оператор сравнения "=" посмотри.

  Ответить  
 
 автор: 3423423   (15.01.2010 в 21:44)
 
   для: 3423423   (15.01.2010 в 21:44)
 

Ну в смысле, оператор сравнения "=="

  Ответить  
 
 автор: heed   (15.01.2010 в 22:36)   письмо автору
 
   для: 3423423   (15.01.2010 в 21:44)
 

:)
и чего там ?

Comparison operators, as their name implies, allow you to compare two values. You may also be interested in viewing the type comparison tables, as they show examples of various type related comparisons.
Comparison OperatorsExample Name Result
$a == $b Equal TRUE if $a is equal to $b.
$a === $b Identical TRUE if $a is equal to $b, and they are of the same type. (introduced in PHP 4)
$a != $b Not equal TRUE if $a is not equal to $b.
$a <> $b Not equal TRUE if $a is not equal to $b.
$a !== $b Not identical TRUE if $a is not equal to $b, or they are not of the same type. (introduced in PHP 4)
$a < $b Less than TRUE if $a is strictly less than $b.
$a > $b Greater than TRUE if $a is strictly greater than $b.
$a <= $b Less than or equal to TRUE if $a is less than or equal to $b.
$a >= $b Greater than or equal to TRUE if $a is greater than or equal to $b.


If you compare an integer with a string, the string is converted to a number. If you compare two numerical strings, they are compared as integers. These rules also apply to the switch statement.

// а так я всегда только своё мнение излагаю :) можете добавить или поправить

  Ответить  
 
 автор: 3453   (15.01.2010 в 23:45)
 
   для: heed   (15.01.2010 в 22:36)
 

С той же страницы, "Comparison with Various Types". И всё.

  Ответить  
 
 автор: heed   (16.01.2010 в 07:20)   письмо автору
 
   для: 3453   (15.01.2010 в 23:45)
 

Это я увидел :)

Как по вашему FALSE переводят в строку "" ?
моё мнение что его никак не переводят ,) потомучто 0x00 и "" в пхп это одно и тоже, было-бы глупо выделять ещё какие-то байты , для приведения NULL к строковому представлению :)

Там ещё написано что две строки сравниваются как последовательности цифр
, но это не значит что каждый байт приводят к типу INT вписыая в четыре байта.

но это опять-же просто моё мнение

  Ответить  
 
 автор: neadekvat   (16.01.2010 в 12:08)   письмо автору
 
   для: heed   (16.01.2010 в 07:20)
 

Тогда, если false, '' и 0 - это все одно и то же (0x00), то почему существует оператор ===, который при false === 0 дает false? ведь 0x00 равно 0x00 и должно быть true
Соответственно можно сделать ввывод, что это все-таки разные вещи..

P.S. сам в исходники не лазил, правильного ответа не знаю, отталкиваюсь от логики.

  Ответить  
 
 автор: GeorgeIV   (16.01.2010 в 12:14)   письмо автору
 
   для: neadekvat   (16.01.2010 в 12:08)
 

Я как то уже писал, что в отличие от многих других интерпретаторов PHP хранит переменную во ВСЕХ типах сразу. Поэтому при == сравниваются только значения соответсвующего типа, а при === учитывается еще и ТЕКУЩИЙ тип каждой переменной.

  Ответить  
 
 автор: neadekvat   (16.01.2010 в 12:26)   письмо автору
 
   для: GeorgeIV   (16.01.2010 в 12:14)
 

Вполне логично :о)

  Ответить  
 
 автор: Trianon   (16.01.2010 в 14:09)   письмо автору
 
   для: GeorgeIV   (16.01.2010 в 12:14)
 

>Я как то уже писал, что в отличие от многих других интерпретаторов PHP хранит переменную во ВСЕХ типах сразу.

Это точно? Или описательная гипербола?

  Ответить  
 
 автор: GeorgeIV   (16.01.2010 в 21:17)   письмо автору
 
   для: Trianon   (16.01.2010 в 14:09)
 

Это с точностью наоборот. Еще раз прочитал руководство, на самом деле там не структура, а юнион (программисты на Си поймут).
:-( полгода пробывал в заблуждении...

  Ответить  
 
 автор: Trianon   (16.01.2010 в 09:10)   письмо автору
 
   для: heed   (15.01.2010 в 22:36)
 

>// а так я всегда только своё мнение излагаю :) можете добавить или поправить

Вот это несколько странно, особенно когда интересуются фактами, а не мнениями.

  Ответить  
 
 автор: psychomc   (16.01.2010 в 12:55)   письмо автору
 
   для: ДобрыйУхх   (15.01.2010 в 17:43)
 

>константа приводиться к числовому контексту или они оба к логическому?

где там константа?

  Ответить  
 
 автор: ДобрыйУхх   (16.01.2010 в 12:57)   письмо автору
 
   для: psychomc   (16.01.2010 в 12:55)
 


$ten = 10;
if ($ten == 1) echo "не печатает";


1 здесь константа

  Ответить  
 
 автор: psychomc   (16.01.2010 в 20:46)   письмо автору
 
   для: ДобрыйУхх   (16.01.2010 в 12:57)
 

либо вы что-то не то говорите, либо я не шарю в языке...
какая константа 1???? 1 это всего лишь число

  Ответить  
 
 автор: ДобрыйУхх   (16.01.2010 в 21:06)   письмо автору
 
   для: psychomc   (16.01.2010 в 20:46)
 

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

  Ответить  
 
 автор: psychomc   (17.01.2010 в 13:03)   письмо автору
 
   для: ДобрыйУхх   (16.01.2010 в 21:06)
 

:))))
я думаю оно нигде не хранится в оперативной памяти. поэтому мне кажется никак не может быть константой :-)

тем более, если я ничего не путаю, в php нельзя объявить константу с таким именем

  Ответить  
 
 автор: ДобрыйУхх   (16.01.2010 в 12:59)   письмо автору
 
   для: ДобрыйУхх   (15.01.2010 в 17:43)
 

Спасибо за ответы, правда я так и не понял про то правильны ли м ои рассуждения в отношении порядка перевода в различные контексты... т.е. сначала перевод в числовой контекст, затем в другой или вообще это в корне не верно?

  Ответить  
 
 автор: heed   (16.01.2010 в 13:57)   письмо автору
 
   для: ДобрыйУхх   (16.01.2010 в 12:59)
 

это в мануале нужно спрашивать :)
, там целая табличка, а она если копипастится получается не очень читабельная

For various types, comparison is done according to the following table (in order).

Comparison with Various Types
Type of Operand 1      Type of Operand 2       Result 
null or string               string     Convert NULL to "", numerical or lexical comparison
bool or null              anything      Convert to bool, FALSE < TRUE 
...................
........
 

//upd: добавил вторую строку , и уже какое-то противоречие, вообще-то (in order) проясняет чего-то


// значит получается кроме самих данных php ещё куда-то сохраняет описание их типа

  Ответить  
 
 автор: ride   (16.01.2010 в 16:01)   письмо автору
 
   для: ДобрыйУхх   (16.01.2010 в 12:59)
 

Дж. Шлосснейгл

...
Сравнение, выполняемое с помощью оператора равенства (==), основывается на активных типах операндов. 
Если операнды являются строками или NULL-значениями, то они сравниваются как строки; 
если один из них имеет тип Boolean, то они преобразовываются в Boolean-значения и сравниваются; 
в противном случае они преобразовываются в числа и сравниваются. 
...

  Ответить  
 
 автор: ДобрыйУхх   (16.01.2010 в 16:43)   письмо автору
 
   для: ride   (16.01.2010 в 16:01)
 

Мои аплодисменты, предельно четко и ясно

  Ответить  
Rambler's Top100
вверх

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