未定义的行为:我在这里有一个postfix和prefix运算符的情况

时间:2012-05-03 10:45:09

标签: php

我在这里有一个使用post fix和prefix operator的情况。看看下面的代码片段。我知道存在一些运算符优先级。但我需要对此作出明确的解释。

<?php
    $a=0;
    echo $a++ + ++$a; //this will result 2 that is ok

    $b=0;
    echo $b++ - ++$b; //this should result 0 isn't it? but am getting -2!
 ?>

更新:接受的答案描述未定义的行为

3 个答案:

答案 0 :(得分:3)

如果您使用未定义的行为,这种情况总会发生。你所做的是未定义的行为。所以不要试图得到一个遵循确定性逻辑的解释,因为未定义是与此相反。

PHP manual states

// mixing ++ and + produces undefined behavior
$a = 1;
echo ++$a + $a++; // may print 4 or 5

您在评论中扩展了您的问题:

  

echo $c=($b++) - (++$b);此声明的结果也变为-2。你的未定义行为是什么意思?

$b = 0 and it shall:

$c=($b++) - (++$b);   | $b is 0  - process first brackets
$c= 0 - (++$b);       | $b is 1  - process second bracktes inner operator
$c= 0 - ($b);         | $b is 2  - process second brackets 
$c= 0 - 2;            | calculate
$c= -2;

这显然是在执行代码时为您的代码生成的 。没有定义这将始终以这种方式计算,因此未定义。例如,如果首先处理第二个括号,您将得到不同的结果。

答案 1 :(得分:2)

由于Incrementing/Decrementing Operators (PHP doc)

<?php
    $a=0;
    echo $a++ + ++$a; // 0 + 2 = 2

    $b=0;
    echo $b++ - ++$b; // 0 - 2 = -2
 ?>

$a++返回0并将$a增加1($a == 1); ++$a$a增加1($a == 2)并返回2

答案 2 :(得分:2)

结果非常好:

$ a ++打印该值并立即递增它 ++ $ a输出前的增量

所以在第一种情况下,这就像:

  1. $ a = 0时
  2. 输出0
  3. 将$ a增加1:$ a = 1
  4. 再次递增(输出前):$ a = 2
  5. 输出2
  6. 0 + 2 = 2

    在第二种情况下:

    1. $ B = 0
    2. 输出0
    3. 将$ b增加1:$ b = 1
    4. 再次递增(输出前):$ b = 2
    5. 输出2
    6. 0 - 2 = -2

      它就像它说的那样。

      此致

      史蒂芬