我这里有一个帖子修复和前缀运算符的情况。看看下面的代码片段。我知道存在一些运算符优先级。但我需要对此有一个明确的解释。
<?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增量
所以在第一种情况下,这将是这样的:
- $a=0
- 输出 0
- $a递增 1:$a=1
- 再次递增(输出前):$a=2
- 输出 2
0+2 = 2
在第二种情况下:
- $b=0
- 输出 0
- $b递增 1:$b=1
- 再次递增(输出前):$b=2
- 输出 2
= -2
它只是按照它所说的去做。
问候
斯特凡