【问题标题】:Increment character works but adding doesn't. Why?增量字符有效,但添加无效。为什么?
【发布时间】:2026-01-16 14:05:02
【问题描述】:
$a = 'a';
print ($a+1);
print ($a++);
print $a;

输出为:1 a b

所以很明显,增量运算符完成了它的工作,但我不明白为什么在$a+1 的情况下输出为“1”。谁能解释一下?

【问题讨论】:

    标签: php


    【解决方案1】:

    PHP 不是 C,所以 'a' + 1 不是 'b'

    'a' 在数字上下文中是 00+1 = 1

    php> echo (int)'a';
    0
    

    后缀/前缀递增运算符 do 的工作方式就像它是 C 字符一样,这​​似乎是 PHP 的一个讨厌的“功能”。特别是因为在这种情况下减量运算符是无操作的。

    当您增加 'z' 时,情况会变得更糟:

    php> $a = 'z';
    php> echo ++$a
    aa
    

    【讨论】:

    • 你是什么意思? :“特别是因为在这种情况下减量运算符是空操作”。
    • 实际上,我不一定会称之为奇怪。它基本上遵循标准的数学规则,以 25 为底(用字母代替数字)。
    • @Shubham "No-op" 的意思是“无操作”,即没有任何反应。在第一个示例之前在这里进行了解释:php.net/manual/en/language.operators.increment.php
    • 顺便说一句,即使在 c 'a'+1 不是 'b' 而是 char('a'+1) !我说的是上流演员。
    • PHP 太奇怪了!感谢您的解释!
    【解决方案2】:

    原因是 PHP 以特定于上下文的方式处理变量。它有点类似于 Visual Basic。

    表达式'a' + 1 使用数学加法。在这种情况下,a 被解释为一个数字,因此它将被视为 0(如果您熟悉 C,这就像将字符串 "a" 输入atoi())。

    如果您使用表达式'a' . 1,结果将是a1,因为它使用了字符串连接。

    要获得预期的结果 (b),您必须使用 chr(ord('a') + 1),其中 ord() 显式返回(第一个)字符的 ASCII 值。

    $a++ 是一种特殊情况,本质上是一种将 ascii 值而不是值本身视为变量的重载。

    【讨论】:

      【解决方案3】:

      http://php.net/manual/en/types.comparisons.php,“a”+1 被执行为 0+1。有些语言 (C#) 会将 (string)+(int) 翻译成 (string)+(string),而 PHP 则相反:(int)+(int)。

      改为强制字符串连接:"a" . 1 产生 'a1'。

      【讨论】:

        【解决方案4】:

        当您执行加法时,PHP 会尝试将 'a' 转换为整数。就像你在 C 中使用 atoi 一样,'a' 被解释为 0。因此 0 + 1 是 1。

        【讨论】:

        最近更新 更多