0

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

<?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!
 ?>

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

4

3 回答 3

3

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

PHP手册指出

// 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;

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

于 2012-05-03T10:51:25.543 回答
2

由于递增/递减运算符(PHP doc)

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

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

$a++返回0并递增$a1 ( $a == 1); ++$a递增$a1 ( $a == 2) 并返回2

于 2012-05-03T10:54:04.837 回答
2

结果非常好:

$a++ 打印值并立即递增 ++$a 在输出前递增

所以在第一种情况下,这将是这样的:

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

0+2 = 2

在第二种情况下:

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

0 - 2 = -2

它只是按照它所说的去做。

问候,

斯蒂芬

于 2012-05-03T10:57:02.653 回答