Дмитрий Сергеевич (axshavan) wrote,
Дмитрий Сергеевич
axshavan

Неявное преобразование типов переменных

Это вообще очень опасная и неприятная штука. Опасная тем, что расхолаживает программиста, и тот перестаёт следить за типами переменных в коде. Опасная тем, что может приводить к совершенно неожиданным для программиста результатам.
Ну вообще неявного преобразования типов переменных нет в таких суровых языках, как си или паскаль. А вот в менее суровом и более простеньком, таком, как пхп, есть. Как вы думаете, что будет, если к строке попытаться прибавить число? Сишный или паскальный компилятор должен ругаться и говорить, что не совпадают типы переменных. Пусть даже у вас строка вида "123", всё равно надо её предварительно переделать в число 123. В си это какая-нибудь функция типа atoi(), в дельфи что нибудь вроде strtoint().

Но что сделает пхп в том случае, если вы попытаетесь прибавить к строке число? Интерпретатор, не спрашивая разрешения, сам переведёт строку в число и прибавит, и даже никакой нотис не покажет. Поэтому типы переменных integer, string, bool и float в пхп свободно перетекают друг в друга. Кстати говоря, пхп без спросу может преобразовывать и такие типы переменных, как объект, массив и ресурс, теряя из них всё, что можно, поэтому надо аккуратнее за этим всем следить.

То же и при сравнении. Строка "123" и число 123 оказываются в пхп вполне однаковыми при сравнении оператором ==. Поэтому существует специальный оператор ===, подавляющий неявное преобразование типов переменных:
echo "123" == 123; // 1
echo "123" === 123; // 0
И ещё один классический пример. Функция strpos() ищет подстроку в строке и возвращает либо её позицию (количество символов от начала строки до начала найденной в ней подстроки), либо false. Если строка начинается с искомой подстроки, то, разумеется, strpos() вернёт 0. 0 и false это разные вещи, но различить их можно только с помощью ===, при использовании == может оказаться так, что выполнение алгоритма пойдёт в неправильном направлении.

В джаваскриптах ситуация ещё хуже. Если в пхп конкатенация строк (слепление нескольких строк в одну, у нас, у программистов, это называется именно так) производится оператором-точкой, то в джаваскриптах для этого годится обычный плюс. Поэтому получаются разнообразные эффекты.
alert((1 + 1) / 2); // 1
alert((1 + "1") / 2); // 5.5
alert((1 + 1 + "1") / 2); // 10.5

Не знаю, как дела обстоят в перле и питоне. У меня есть мысль, что надо их как-нибудь выучить для собственного, так сказать, саморазвития.
Tags: web
Subscribe

  • Размышления про материалы

    Восседая на троне в специальной комнате, я призадумался о свойствах туалетной бумаги и о том, чем можно её заменить. Очень часто бывает, знаете, что…

  • Dracula

    Вчера вечером наконец-то дочитал до конца «Дракулу» на английском. Правильнее будет сказать «продрался до конца». Чтоб я да ещё да какую-нибудь…

  • Завтрак

    С каждой годовщиной ведения своего ЖЖ я к посту со статистическими данными обычно добавляю подборку ссылок на мои посты за прошедший год, которые…

  • Post a new comment

    Error

    Comments allowed for friends only

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 12 comments

  • Размышления про материалы

    Восседая на троне в специальной комнате, я призадумался о свойствах туалетной бумаги и о том, чем можно её заменить. Очень часто бывает, знаете, что…

  • Dracula

    Вчера вечером наконец-то дочитал до конца «Дракулу» на английском. Правильнее будет сказать «продрался до конца». Чтоб я да ещё да какую-нибудь…

  • Завтрак

    С каждой годовщиной ведения своего ЖЖ я к посту со статистическими данными обычно добавляю подборку ссылок на мои посты за прошедший год, которые…