То ли воздух нынче пьян, то ли леший нынче рьян...

WMix

герр M:)ller
Партнер клуба
в тот момент когда мы дефинировали что любое число умноженное на ноль дает в результате ноль, приходится мириться с тем что делить на ноль мы не умеем!
и если '08'+1 должно давать 9 то понятно что '08' == 8
 

Yaponchick

Новичок
WMix
Но тут же нет меж-типовых сравнений, зачем лишний раз конвертировать?
 

Фанат

oncle terrible
Команда форума
сразу когда стоят операторы +-*/ == и др.
А. То есть, ты хочешь сказать, что при вызове любого оператора (т.е. даже "."?) сначала происходит автоматический кастинг? вот тупо позырим - а не число ли?

то есть алгоритм НЕ
PHP:
оба оператора строки? сравниваем как строки : рожаем какую-то более сложную логику
А
PHP:
проведем стандартную обработку операнда 1
проведем стандартную обработку операнда 2
сравниваем
в исходник щас смотрю, но не въезжаю....
сначала покастим оба оператора
 

WMix

герр M:)ller
Партнер клуба
я не вижу лишнего если чесно, вопрос сравнения двух нечто и и мне хотелось бы ожидать от 0008 по умолчанию числовое значение, потому как (int)'0008' мне писать не хочется.

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

Фанат

oncle terrible
Команда форума
сразу когда стоят операторы +-*/ == и др.
Слушай, а ты прав!
Только без др.
zendi_convert_scalar_to_number встречается в zend_operators.c 12 раз:
2 раза - в определении
8 раз - в четырех "basic math" действиях
и 2 раза - в compare_function!
больше нигде.
 

WMix

герр M:)ller
Партнер клуба
я побоялся что забыл что нибудь к примеру "!", !=, += и тд
 

Фанат

oncle terrible
Команда форума
WMix
Но тут же нет меж-типовых сравнений, зачем лишний раз конвертировать?
Вот это да - зогадка.
Единственное объяснение - под одну гребенку сделать было проще.

Но я, в итоге, так и не понял Рагаццевых заклинаний про степень и системы счисления - какое отношение они имеют к сравнению строк.
 

WMix

герр M:)ller
Партнер клуба
возможно было бы логичнее решить зададачу так как вы думаете, но это же правда что все данные чаще strings и если этого не делать для 2х strigs это может закончиться еще хуже и '8.0' из базы не будет равно '8' из http
 

MiksIr

miksir@home:~$
О... "внезапно". Выходные проходят хорошо, вижу ;)
Ну вот вам еще равенство, что бы не скучно было ;)
("1000" == "1e3")
 

MiksIr

miksir@home:~$
Мне вот непонятно скорее другое... ;) Почему "017" тогда уж 17, а не 15 ;)
 

Фанат

oncle terrible
Команда форума
А, так вот что Рагаццо в виду имел.
Не, но это понятно уже, это другое следствие той же причины - предварительного кастинга при сравнении.
А вопрос был - зачем делается этот кастинг.
 

WMix

герр M:)ller
Партнер клуба
это самое страшное согласен, но как я уже говорил, если мы создали такой дефининицион, приходится мириться и с этим...
а что там про '017' имелось в виду?
 

MiksIr

miksir@home:~$
Так вот для этого хотя бы. PHP помогает не думать о типах, правильно? Вот все и работает именно так, как если не думать о типах. 0008 - это же 8, правильно? Ну вот любого спроси - у тебя в кармане 0008 рублей, сколько у тебя в кармане рублей? ;))
А как только начинаешь задумываться "я же сравниваю string", то все, забыли про == и взяли ===.
 

WMix

герр M:)ller
Партнер клуба
А вопрос был - зачем делается этот кастинг.
для нашего удобства, естественно, чтоб не кастить каждую переменную. и более менее язык понимает человеческую натуру, и я не чувствую себя машиной, обьясняя железке число это или буква, она прекрасно справляется. за это я и люблю пхп
 

WMix

герр M:)ller
Партнер клуба
017 это восмеричная а '017' это десятичная.
чтож ты про 16ричные забыл? они в кавычках тоже не интерпретируются (кажется)
 

Фанат

oncle terrible
Команда форума
для нашего удобства, естественно, чтоб не кастить каждую переменную. и более менее язык понимает человеческую натуру, и я не чувствую себя машиной, обьясняя железке число это или буква, она прекрасно справляется. за это я и люблю пхп
Любовь - прекрасное чувство, но когда мне объясняют, что строка '8' равна строке '000000000008' - у меня чувство, что меня на... эээ... обманывают.
 
  • Like
Реакции: WMix

Фанат

oncle terrible
Команда форума
Все равно не понимаю.
Вот объясните, кто в теме
https://github.com/php/php-src/blob/a744390c503645d0326a2aff26c986f85ffc3a01/Zend/zend_operators.c#L1465
Вот у нас понеслась эта свитчь. Доходим до
PHP:
case TYPE_PAIR(IS_STRING, IS_STRING):
ПОЧЕМУ мы здесь не вылетаем, а идем дальше, к
PHP:
if (!converted) {
и дальше конвертируемся и уходим на новый цикл?
 

WMix

герр M:)ller
Партнер клуба
я думаю там вызывается zendi_smart_strcmp
и там написанно
if ((ret1=is_numeric_string_ex(Z_STRVAL_P(s1), Z_STRLEN_P(s1), &lval1, &dval1, 0, &oflow1)) &&.....
 
Сверху