【发布时间】:2026-01-16 14:05:02
【问题描述】:
$a = 'a';
print ($a+1);
print ($a++);
print $a;
输出为:1 a b
所以很明显,增量运算符完成了它的工作,但我不明白为什么在$a+1 的情况下输出为“1”。谁能解释一下?
【问题讨论】:
标签: php
$a = 'a';
print ($a+1);
print ($a++);
print $a;
输出为:1 a b
所以很明显,增量运算符完成了它的工作,但我不明白为什么在$a+1 的情况下输出为“1”。谁能解释一下?
【问题讨论】:
标签: php
PHP 不是 C,所以 'a' + 1 不是 'b'。
'a' 在数字上下文中是 0 和 0+1 = 1。
php> echo (int)'a';
0
后缀/前缀递增运算符 do 的工作方式就像它是 C 字符一样,这似乎是 PHP 的一个讨厌的“功能”。特别是因为在这种情况下减量运算符是无操作的。
当您增加 'z' 时,情况会变得更糟:
php> $a = 'z';
php> echo ++$a
aa
【讨论】:
原因是 PHP 以特定于上下文的方式处理变量。它有点类似于 Visual Basic。
表达式'a' + 1 使用数学加法。在这种情况下,a 被解释为一个数字,因此它将被视为 0(如果您熟悉 C,这就像将字符串 "a" 输入atoi())。
如果您使用表达式'a' . 1,结果将是a1,因为它使用了字符串连接。
要获得预期的结果 (b),您必须使用 chr(ord('a') + 1),其中 ord() 显式返回(第一个)字符的 ASCII 值。
$a++ 是一种特殊情况,本质上是一种将 ascii 值而不是值本身视为变量的重载。
【讨论】:
从http://php.net/manual/en/types.comparisons.php,“a”+1 被执行为 0+1。有些语言 (C#) 会将 (string)+(int) 翻译成 (string)+(string),而 PHP 则相反:(int)+(int)。
改为强制字符串连接:"a" . 1 产生 'a1'。
【讨论】:
当您执行加法时,PHP 会尝试将 'a' 转换为整数。就像你在 C 中使用 atoi 一样,'a' 被解释为 0。因此 0 + 1 是 1。
【讨论】:
$a++ 将$a 的值改为b 而不是1?