【问题标题】:Strange behaviour of ++ operator in PHP 5.3PHP 5.3 中 ++ 运算符的奇怪行为
【发布时间】:2010-09-26 19:58:50
【问题描述】:

观看以下代码:

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

这将输出:

Tesu

问题是,为什么?

我知道“u”在“t”之后,但为什么它不打印“1”???

PHP 文档:

此外,变量正在递增 或递减将转换为 适当的数字数据 类型——因此,下面的代码将 返回 1,因为字符串 Test 是 首先转换为整数 0,然后递增。

【问题讨论】:

  • 在增加字符串后打印1会很奇怪。
  • @David Titarenco - 我的猜测是 Michal 期望 ++ 将字符串隐式转换为整数,并且与显式转换类似,产生 0。这不是不合理的期望,请思考其中,因为 ++ 是一个数学运算符。
  • @Col。弹片:$a + 1++$a$a++不一样。
  • @BoltClock 很有启发性。愿意阅读整个主题吗?
  • @Col。弹片 - 很好的例子。将它(没有双关语)添加到我的答案中。字符串可以使用增量运算符递增,但不能“添加到”,除非使用连接。

标签: php operators


【解决方案1】:

在处理字符变量而不是 C 的算术运算时,PHP 遵循 Perl 的约定。例如,在 Perl 中 'Z'+1 变成 'AA',而在 C 中 'Z'+1 变成 '[' ( ord('Z') == 90, ord('[') == 91 ) .请注意,字符变量可以递增但不能递减,即使如此,也仅支持纯 ASCII 字符(a-z 和 A-Z)。

来源:http://php.net/operators.increment

【讨论】:

    【解决方案2】:

    在 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;
    ?>
    

    live example

    上面利用了字符串只能在 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而不改变字符串。


    【讨论】:

    • 很好的编辑,但是,为了说明这一点,字符串被“添加到”,即在您的代码中,1 被添加到 0(“测试”的后转换值)。对于例如尝试 echo '7test' + 0;
    • @GZipp - 那么,你会如何解释差异? "字符串只能使用自增运算符相加,而不能使用加法运算符。"?
    • 我认为“添加到”意味着串联。
    • @Peter Ajtai: $a + 1 在添加 1 之前对 $a 执行隐式类型转换,因为该表达式中有两个显式操作数,而 + 就像你说的那样不是串联PHP 中的运算符。因此它等价于(int)$a + 1
    • 我知道PHP中的连接运算符是什么。我误读了你之前的帖子。我很抱歉。我想说的是,在你的代码中,加法实际上是 0 + 1,我相信你知道。
    【解决方案3】:

    PHP 中的自增操作符在内部作用于字符串的序数值。字符串在递增之前不会转换为整数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 2018-03-12
      • 2013-10-29
      • 2012-12-01
      • 2015-02-01
      相关资源
      最近更新 更多