|
|
|
| Здравствуйте.
Очередной вопрос от меня по операциям сравнения. В данном случае речь идет о правилах сравнения и преобразования.
Дано:
$a = 0;
if ("$a" == "") echo "Есть равенство";
|
Я рассуждаю так: переменная $a равна 0. В операции сравнения используется не число, а подставляется эта переменная в кавычках. Согласно информации из книги Котерова, переменные в строках, заключенных в кавычки, интерполируются. Таким образом, я предположил, что эта переменная должна была интерполироваться, то есть предстать в виде 0. Пустая строка "' трактуется как 0. И, таким образом, должно быть равенство. Но его нет.
Отсюда вопрос: разве правила интерполяции не действуют в операциях сравнения? Если нет, то почему? Не могу найти информации по этому вопросу.
На оф.сайте мануал говорит, что строки преобразуются в числа, но и этого не происходит. Почему? Можете толково пояснить этот момент? Или это такая недокументированная особенность?
Спасибо. | |
|
|
|
|
|
|
|
для: baston
(22.01.2010 в 23:48)
| | после подстановки Вы получите "0" == ""
неужели, то что такое выражение не может трактоваться, как истинное, требует отдельного пояснения?
Если "0" == "" - истина , как тогда вообще строки сравнивать на равенство? | |
|
|
|
|
|
|
|
для: Trianon
(22.01.2010 в 23:52)
| | Для меня требует, увы...
Почему после подстановки я получу 0 в кавычках? Почему не просто 0 как число? Почему пустая строка "' не трактуется как 0? Простые может быть вопросы, но ответов-то на них нет...
P.S. Мой вопрос не касается сравнения как такового, а меня больше интересует именно значения операндов. | |
|
|
|
|
|
|
|
для: baston
(23.01.2010 в 00:01)
| | > Почему после подстановки я получу 0 в кавычках?
Может, потому что вы там сами кавычки поставили? Разницу между ...$a ==... и ..."$a" == чувстввуете? Без кавычек строки указываться не могут. Все, что в кавычках при сравнении - строка.
"" - это не 0, это строка, длиною в ноль.
Разве строка "0" равна ""? Не расценивайте сейчас 0 как пустоту, в кавычках 0 - это уже часть строки, поэтому не может просто игнорироваться. | |
|
|
|
|
|
|
|
для: baston
(23.01.2010 в 00:01)
| | >Почему после подстановки я получу 0 в кавычках?
Потому что после подстановки строка все равно остается строкой.
>Почему не просто 0 как число? Почему пустая строка "' не трактуется как 0?
А зачем строку трактовать как что-то другое, в то время в операции сравнения участвуют операнды одного базового типа?
>Простые может быть вопросы, но ответов-то на них нет...
>P.S. Мой вопрос не касается сравнения как такового, а меня больше интересует именно значения операндов.
Вот я про значения и говорю. Значениям присущи типы. В данном случае одинаковые, а значит сравнение на равенство выполняется точно также, как и на эквивалентность.
Вы, кстати, в курсе что 0 != "00" несмотря на то что 0 == "0" ?
Это факт куда менее очевидный, для меня во всяком случае. | |
|
|
|
|
|
|
|
для: Trianon
(23.01.2010 в 00:18)
| | >>Почему после подстановки я получу 0 в кавычках?
>Потому что после подстановки строка все равно остается строкой.
Тут я ступил однозначно...
>А зачем строку трактовать как что-то другое, в то время в операции сравнения участвуют операнды одного базового типа?
Понял свою ошибку. В данном случае оба операнда строки (даже после интерполирования, так как 0 все равно будет в кавычках), поэтому и должны сравниваться как строки (без преобразований). А строки сравниваются побайтно. В данном случае они действительно разные ("0" содержит значение, а "" - пустота).
>"" - это не 0, это строка, длиною в ноль.
Вот, спасибо, разобрался в этом вопросе.
>Вы, кстати, в курсе что 0 != "00" несмотря на то что 0 == "0" ?
0 == "0", в этом случае типы разные. 0 как число, а "0" как строка. Если один из операндов является числовым, то и второй операнд интерпретируется как числовой. Вот и получается, что 0 == 0.
0 != "00", в этом случае "00" это строка, и теоретически она должна быть преобразована в число. Функция INT дает значение 0, но я затрудняюсь сказать, почему они не равны - не знаю элементарно. Разьясните пожалуйста. | |
|
|
|