Подтвердить что ты не робот

Странное поведение оператора ++ в PHP 5.3

Следите за следующим кодом:

$a = 'Test';
echo ++$a;

Это выведет:

Tesu

Вопрос: почему?

Я знаю, что "u" после "t", но почему он не печатает "1"???

РЕДАКТИРОВАТЬ: Becouse Книги Zend обучают следующему:

Кроме того, изменяемая переменная или уменьшенный, будет преобразован в соответствующие числовые данные type, таким образом, следующий код будет return 1, потому что строка Test сначала преобразуется в целое число 0, а затем увеличивается.

4b9b3361

Ответ 1

В PHP вы можете увеличивать строки (но вы не можете "увеличивать" строки с помощью оператора сложения, так как оператор добавления приведет к тому, что строка будет перенесена в int, вы можете использовать оператор инкремента только для "увеличения", строки!... см. последний пример):

Итак "a" + 1 есть "b" после "z" приходит "aa" и т.д.

Итак, после "Test" приходит "Tesu"

Вы должны следить за вышеуказанным при использовании автоматического автоматического принуждения PHP.

Автоматическое принуждение типа:

<?php
$a="+10.5";
echo ++$a;

// Output: 11.5
//   Automatic type coercion worked "intuitively"
?>


Нет автоматического принуждения типа! (приращение строки):

<?php
$a="$10.5";
echo ++$a;

// Output: $10.6
//   $a was dealt with as a string!
?>



Вам нужно сделать дополнительную работу, если вы хотите иметь дело с ординалами букв ASCII.

Если вы хотите конвертировать буквы в их ASCII-ординалы, используйте ord(), но это будет работать только по одной букве за раз.

<?php
$a="Test";
foreach(str_split($a) as $value)
{
    $a += ord($value);  // string + number = number
                        //   strings can only handle the increment operator
                        //   not the addition operator (the addition operator
                        //   will cast the string to an int).
}
echo ++$a;
?>

живой пример

В приведенном выше примере используется тот факт, что строки могут быть только добавлены в PHP. Они не могут быть увеличены с помощью оператора сложения. Использование оператора сложения в строке приведет к тому, что оно будет перенесено в int, поэтому:

Строки нельзя "увеличить" с помощью оператора сложения:

<?php
   $a = 'Test';
   $a = $a + 1;
   echo $a;

   // Output: 1
   //  Strings cannot be "added to", they can only be incremented using ++
   //  The above performs $a = ( (int) $a ) + 1;
?>

Вышеприведённый пример будет поставлен Test "на (int) перед добавлением 1. Литье" Test" на (int) приводит к 0.


Примечание. Вы не можете уменьшить строки:

Обратите внимание, что символьные переменные могут увеличиваться, но не уменьшаться, и даже поэтому поддерживаются только простые символы ASCII (a-z и A-Z).

Предыдущее означает, что echo --$a; будет фактически печатать Test без изменения строки вообще.


Ответ 2

PHP следует за соглашением Perl при работе с арифметическими операциями над символьными переменными, а не с C. Например, в Perl 'Z' + 1 превращается в 'AA', а в C 'Z' + 1 превращается в '[' (ord ('Z') == 90, ord ('[') == 91), Обратите внимание, что символьные переменные могут увеличиваться, но не уменьшаться, и поэтому поддерживаются только простые символы ASCII (a-z и A-Z).

Источник: http://php.net/operators.increment

Ответ 3

Оператор приращения в PHP работает с порядковыми значениями строк внутри. Строки не добавляются в целые числа до приращения.