未定义的行为 :我这里有后缀和前缀运算符的情况


Undefined Behavior : I have a situation here with postfix and 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!
 ?>

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

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

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;

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

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

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

结果非常好:

$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

只是按照它所说的去做。

问候

斯特凡