|
|
|
| Здравствуйте, кто нибудь может прояснить правила по которым выражение приводится к тому или иному контексту?
в этом выражении
if (false == "") echo "странно - печатает";
|
Сначала "" преобразуется в 0 и получается контекст числовой, затем 0 преобразуется в false и контекст логический? Ход рассуждений правильный?
и второй вопрос
$ten = 10;
if ($ten == 1) echo "не печатает";
|
константа приводиться к числовому контексту или они оба к логическому? | |
|
|
|
|
|
|
|
для: ДобрыйУхх
(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)
| | Ну в смысле, оператор сравнения "==" | |
|
|
|
|
|
|
|
для: 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". И всё. | |
|
|
|
|
|
|
|
для: 3453
(15.01.2010 в 23:45)
| | Это я увидел :)
Как по вашему FALSE переводят в строку "" ?
моё мнение что его никак не переводят ,) потомучто 0x00 и "" в пхп это одно и тоже, было-бы глупо выделять ещё какие-то байты , для приведения NULL к строковому представлению :)
Там ещё написано что две строки сравниваются как последовательности цифр
, но это не значит что каждый байт приводят к типу INT вписыая в четыре байта.
но это опять-же просто моё мнение | |
|
|
|
|
|
|
|
для: heed
(16.01.2010 в 07:20)
| | Тогда, если false, '' и 0 - это все одно и то же (0x00), то почему существует оператор ===, который при false === 0 дает false? ведь 0x00 равно 0x00 и должно быть true
Соответственно можно сделать ввывод, что это все-таки разные вещи..
P.S. сам в исходники не лазил, правильного ответа не знаю, отталкиваюсь от логики. | |
|
|
|
|
|
|
|
для: neadekvat
(16.01.2010 в 12:08)
| | Я как то уже писал, что в отличие от многих других интерпретаторов PHP хранит переменную во ВСЕХ типах сразу. Поэтому при == сравниваются только значения соответсвующего типа, а при === учитывается еще и ТЕКУЩИЙ тип каждой переменной. | |
|
|
|
|
|
|
|
для: GeorgeIV
(16.01.2010 в 12:14)
| | Вполне логично :о) | |
|
|
|
|
|
|
|
для: GeorgeIV
(16.01.2010 в 12:14)
| | >Я как то уже писал, что в отличие от многих других интерпретаторов PHP хранит переменную во ВСЕХ типах сразу.
Это точно? Или описательная гипербола? | |
|
|
|
|
|
|
|
для: Trianon
(16.01.2010 в 14:09)
| | Это с точностью наоборот. Еще раз прочитал руководство, на самом деле там не структура, а юнион (программисты на Си поймут).
:-( полгода пробывал в заблуждении... | |
|
|
|
|
|
|
|
для: heed
(15.01.2010 в 22:36)
| | >// а так я всегда только своё мнение излагаю :) можете добавить или поправить
Вот это несколько странно, особенно когда интересуются фактами, а не мнениями. | |
|
|
|
|
|
|
|
для: ДобрыйУхх
(15.01.2010 в 17:43)
| | >константа приводиться к числовому контексту или они оба к логическому?
где там константа? | |
|
|
|
|
|
|
|
для: psychomc
(16.01.2010 в 12:55)
| |
$ten = 10;
if ($ten == 1) echo "не печатает";
|
1 здесь константа | |
|
|
|
|
|
|
|
для: ДобрыйУхх
(16.01.2010 в 12:57)
| | либо вы что-то не то говорите, либо я не шарю в языке...
какая константа 1???? 1 это всего лишь число | |
|
|
|
|
|
|
|
для: psychomc
(16.01.2010 в 20:46)
| | это число нельзя изменить в оперативной памяти, поскольку мы не знаем имени ячейки, в которой она храниться, значит это контакта))), но спорить не буду, просто логически) | |
|
|
|
|
|
|
|
для: ДобрыйУхх
(16.01.2010 в 21:06)
| | :))))
я думаю оно нигде не хранится в оперативной памяти. поэтому мне кажется никак не может быть константой :-)
тем более, если я ничего не путаю, в php нельзя объявить константу с таким именем | |
|
|
|
|
|
|
|
для: ДобрыйУхх
(15.01.2010 в 17:43)
| | Спасибо за ответы, правда я так и не понял про то правильны ли м ои рассуждения в отношении порядка перевода в различные контексты... т.е. сначала перевод в числовой контекст, затем в другой или вообще это в корне не верно? | |
|
|
|
|
|
|
|
для: ДобрыйУхх
(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 ещё куда-то сохраняет описание их типа | |
|
|
|
|
|
|
|
для: ДобрыйУхх
(16.01.2010 в 12:59)
| | Дж. Шлосснейгл
...
Сравнение, выполняемое с помощью оператора равенства (==), основывается на активных типах операндов.
Если операнды являются строками или NULL-значениями, то они сравниваются как строки;
если один из них имеет тип Boolean, то они преобразовываются в Boolean-значения и сравниваются;
в противном случае они преобразовываются в числа и сравниваются.
...
|
| |
|
|
|
|
|
|
|
для: ride
(16.01.2010 в 16:01)
| | Мои аплодисменты, предельно четко и ясно | |
|
|
|