[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: It's a magic
Страницы: 1, 2
Invis1ble
$a = 'a';
$a ++;
echo $a; // b

$a = 'a';
$a = $a + 1;
echo $a; // 1

Взято из другого топика. Есть у кого-то объяснение происходящему?
Только не надо писать, что во втором варианте 'a' приводится к int, это я и сам знаю.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

curious
Про первый вариант кажется:
PHP следует соглашениям Perl (в отличие от С) касательно выполнения арифметических операций с символьными переменными. Например, в PHP и Perl $a = 'Z'; $a++; присвоит $a значение 'AA', в то время как в C a = 'Z'; a++; присвоит a значение '[' (ASCII значение 'Z' равно 90, а ASCII значение '[' равно 91). Следует учесть, что к символьным переменным можно применять операцию инкремента, в то время как операцию декремента применять нельзя, кроме того, поддерживаются только ASCII символы (a-z и A-Z). Попытка инкремента/декремента других символьных переменных не будет иметь никакого эффекта, исходная строка останется неизменной.

Пример #1 Арифметические операции с символьными переменными

$i = 'W';
for ($n=0; $n<6; $n++) {
echo ++$i . "\n";
}



Результат выполнения данного примера:

X
Y
Z
AA
AB
AC

http://www.php.net/manual/ru/language.oper...s.increment.php


про второй вариант:

Преобразование строк в числа

Цитата
Если строка начинается с верного числового значения, будет использовано это значение. Иначе значением будет 0 (ноль).
GET
Мне кажется потому что:

Цитата
$a ++;

Сначала возвращает значение $a = 'a' - символ, а затем увеличивает $a на единицу т.е. следующий по порядку символ: 'b'. ord('a')+1=ord('b');

Цитата
$a = $a + 1;
//приводит к 0 и соответсвенно дальше уже операция с цифрой

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GET
Цитата
а затем увеличивает $a на единицу т.е. следующий по порядку символ:

хотя разобраться...чего ради smile.gif

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Invis1ble
Цитата
PHP следует соглашениям Perl (в отличие от С) касательно выполнения арифметических операций с символьными переменными. Например, в PHP и Perl $a = 'Z'; $a++; присвоит $a значение 'AA', в то время как в C a = 'Z'; a++; присвоит a значение '[' (ASCII значение 'Z' равно 90, а ASCII значение '[' равно 91). Следует учесть, что к символьным переменным можно применять операцию инкремента, в то время как операцию декремента применять нельзя, кроме того, поддерживаются только ASCII символы (a-z и A-Z). Попытка инкремента/декремента других символьных переменных не будет иметь никакого эффекта, исходная строка останется неизменной.

Что-то я как-то упустил эту особенность, думал что это баг какой-то. И на старуху бывает проруха smile.gif Спасибо.

Несмотря на то, что оба поведения задокументированы, получается какое-то противоречие, ИМХО, ведь во всех остальных случаях инкремент унарным оператором равнозначен инкременту с бинарным оператором.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

killer8080
Цитата (Invis1ble @ 2.03.2014 - 08:55)
Несмотря на то, что оба поведения задокументированы, получается какое-то противоречие, ИМХО, ведь во всех остальных случаях инкремент унарным оператором равнозначен инкременту с бинарным оператором.

Вот за такие противоречия тру программеры и кидаются в php гнилыми помидорами smile.gif
linker
Какие противоречия? Какие тру программеры? Вы когда в мануал заглядывали в последний раз?
Цитата
PHP следует соглашениям Perl (в отличие от С) касательно выполнения арифметических операций с символьными переменными. Например, в PHP и Perl $a = 'Z'; $a++; присвоит $a значение 'AA', в то время как в C a = 'Z'; a++; присвоит a значение '[' (ASCII значение 'Z' равно 90, а ASCII значение '[' равно 91). Следует учесть, что к символьным переменным можно применять операцию инкремента, в то время как операцию декремента применять нельзя, кроме того, поддерживаются только ASCII символы (a-z и A-Z).
Invis1ble
linker
просвети, чем отличается:
$a ++;

от
$a = $a + 1;

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

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

killer8080
Цитата (linker @ 2.03.2014 - 12:26)
Какие противоречия?

как какие не явное поведение, противоречащее логике.
linker
killer8080
Invis1ble
Господа, давайте разберёмся. Во-первых, операции инкремента и декремента не являются арифметическими операциями. Во-вторых, операции инкремента и декремента производятся непосредственно над значением, хранящимся, грубо говоря, в ячейке памяти или регистре процессора. В-третьих, символ - это всего лишь байт-код, хотя бы из той же таблицы ASCII, и именно этот байт-код хранится в ячейке памяти или регистре. В-четвёртым, когда делаем инкремент этому бай-коду, то это значение увеличивается на единицу и соответственно тот байт-код, что представлял символ 'a' уже представляет символ 'b'. Я не знаю, какие надстройки существуют в компиляторе того же C или интерпретаторах Perl, PHP, но на уровне ассемблера это справедливо.

_____________
Gear Framework
Gear Framework на Github
Invis1ble
Цитата (linker @ 2.03.2014 - 16:37)
killer8080
Invis1ble
Господа, давайте разберёмся. Во-первых, операции инкремента и декремента не являются арифметическими операциями. Во-вторых, операции инкремента и декремента производятся непосредственно над значением, хранящимся, грубо говоря, в ячейке памяти или регистре процессора. В-третьих, символ - это всего лишь байт-код, хотя бы из той же таблицы ASCII, и именно этот байт-код хранится в ячейке памяти или регистре. В-четвёртым, когда делаем инкремент этому бай-коду, то это значение увеличивается на единицу и соответственно тот байт-код, что представлял символ 'a' уже представляет символ 'b'. Я не знаю, какие надстройки существуют в компиляторе того же C или интерпретаторах Perl, PHP, но на уровне ассемблера это справедливо.

Спасибо, кэп. Вопрос не об этом стоял.
Цитата (linker @ 2.03.2014 - 12:26)
Какие противоречия?
linker
Вопрос стоял именно в этом и я вроде достаточно доходчиво объяснил почему нет никаких противоречий между
$a = 'a';
echo ++ $a; // 'b'

и
$a = 'a';
echo $a + 1; // 1

все противоречия от незнания низкоуровневых операций.

_____________
Gear Framework
Gear Framework на Github
linker
P.S. Единственная проблема в том, что при сложении PHP вынужден привести значение $a к целочисленному значению.

_____________
Gear Framework
Gear Framework на Github
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.