2013-01-02 53 views
8

在PHP手册,operator precedence section的输出,有这样的例子:

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

我理解的行为是由于以下原因未定义:

由于x + y = y + x口译员可以自由评估xy添加任何顺序,以优化速度和/或内存。我在看完C code example in this article后得出这个结论。

我的问题是,上述的PHP代码的输出应为4不管表达和子表达式进行求值,其方式:

  • OP1 = ++ $ A => $ a = 2的,op1 = 2; op2 = $ a ++ => op2 = 2,$ a = 3; 2 + 2 = 4
  • op1 = $ a ++ => op1 = 1,$ a = 2; op2 = ++ $ a => op2 = 3,$ a = 3; 1 + 3 = 4

5从哪里来?还是应该更多地了解运营商的工作方式?

编辑:

我在Incrementing/Decrementing Operators节一直盯着,但仍无法为什么5

++ $一个弄明白:预增 - 增加$一个接一个,那么返回$ a。
$ a ++:后增值 - 返回$ a,然后将$ a加1。

+0

运行此代码时,你真的得到5印吗? – Ranty

+0

不,我总是得到4几个版本的PHP。它是_may_这个词,意思是我可以运行这个代码一百万次获得reesult 4,但是没有_guarantee_。 –

+0

@ H2CO3:我更感兴趣知道_为什么5_。 –

回答

5
a = 1; 
++ (preincrement) gives a = 2 (higher precedence than +, and LR higher precedence than postincrement) 
++ (postincrement) gives a = 3 (higher precedence than +) 
+ (add) gives 2 + 3 = 5 

$一个最初设置为1,++ $一个然后preincrements $一式中使用它,将它设置为2,并推动该值到词法分析器堆栈之前。然后执行$ ++,因为递增器的优先级高于+,并且该值也将该结果推送到词法分析器堆栈;然后发生的添加将词法分析器堆栈的2结果添加到词法分析器堆栈的3结果中,结果为5,然后进行回显。的$ a的值一旦已经执行的行是3。

OR

a = 1; 
++ (preincrement) gives a = 2 (higher precedence than +, and LR higher precedence than postincrement) 
+ (add) gives 2 + 2 = 4 (the value that is echoed) 
++ (postincrement) gives a = 3 (incremented __after__ the variable is echoed) 

$一个最初设置为1,当公式是解析中,++ $一个preincrements $ A,在公式中使用它之前将其设置为2(将结果推送到词法分析器堆栈)。然后将词法分析器堆栈的结果和$ a的当前值相加,得到4;并且这个值被回应。最后,$ a被postincremented,在$ a中留下值3。

+2

我编辑了我的问题。我也想到了这一点,但后来认识到后增量将返回当前值(即2),然后增加a。 –

1

是的,它会给你5,因为右侧运算符首先按优先级/优先级工作,之后运算总和(+)运算符。 所以第一个增量,使得它2和第二使它成为3,之后双方将总结和输出你的结果为5

$result = ++$a + $a++; 

++$a输出为2个

$a++输出,只不过内部2 3它会增加。

终于总结会发生2 + 3 = 5

+2

“是的,它会给你5” - 而是“是的,它也可能会给你5”。 – 2013-01-02 07:30:28

+0

即使在评估$ a ++之后$ a是3,表达式$ a ++仍然计算为2,所以总和为2 + 2。 – fgb

0

马克,我相信你错了!

后递增:返回$ a,然后将$ a递增1。 (来自文件)

因此,没有办法获得总和操作中$ 3的值。

+0

问题是结果是不可预测的:OP询问如何得到5的结果是可能的,而不是它是否给出了5 –

+0

的结果但是然后解释:“++ $ a给出0和$ a ++给出5,所以0 + 5 = 5“会付出同样的努力。我的意思是,两者都反对文件。 – TomTom

相关问题