Php echo+的输出应该是什么+$a和x2B$a和x2B+;
在PHP手册中,有以下示例:Php echo+的输出应该是什么+$a和x2B$a和x2B+;,php,operator-precedence,post-increment,pre-increment,Php,Operator Precedence,Post Increment,Pre Increment,在PHP手册中,有以下示例: // mixing ++ and + produces undefined behavior $a = 1; echo ++$a + $a++; // may print 4 or 5 我理解该行为未定义,原因如下: 由于x+y=y+x解释器可自由评估x和y以任何顺序添加,以优化速度和/或内存。我在看了这篇文章后得出了结论 我的问题是,无论以何种方式计算表达式和子表达式,上述PHP代码的输出都应该是4: op1=+$a=>$a=2,op1=2;op2=$a++=
// mixing ++ and + produces undefined behavior
$a = 1;
echo ++$a + $a++; // may print 4 or 5
我理解该行为未定义,原因如下:
由于x+y=y+x
解释器可自由评估x
和y
以任何顺序添加,以优化速度和/或内存。我在看了这篇文章后得出了结论
我的问题是,无论以何种方式计算表达式和子表达式,上述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
$a++:Post increment——返回$a,然后将$a增加1 $a最初设置为1。然后,++$a在公式中使用$a之前预先增加$a,将其设置为2,并将该值推送到lexer堆栈上。然后执行$++,因为incrementor的优先级高于+,并且该值也会将结果推送到lexer堆栈上;然后发生的加法将lexer堆栈的2个结果与lexer堆栈的3个结果相加,得到5的结果,然后进行回声处理。行执行后$a的值为3 或
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)
$a最初设置为1。解析公式时,++$a会将$a递增,在公式中使用它之前将其设置为2(将结果推送到lexer堆栈)。lexer堆栈的结果和$a的当前值相加,得到4;这个值会得到响应。最后,$a被后加,在$a中留下一个值3。是的,它将给您5,因为右侧操作符首先根据其优先级/优先级工作,然后sum(+)操作符将工作。 第一个增量等于2,第二个增量等于3,然后两者相加,并将结果输出为5
$result = ++$a + $a++;
+$a
输出为2
$a++
仅输出为23,但在内部它将递增
最后的结果是2+3=5,我相信你错了 后期增量:返回$a,然后将$a增量1。(来自文件)
因此,在求和运算中无法得到$a值3。在运行此代码时,您真的打印了5吗?没有。在一些版本的PHP中,我总是得到4。“可能”这个词意味着我可以运行这个代码一百万次,得到reesult 4,但没有保证。@H2CO3:我更感兴趣的是了解原因5。请记住,编译器/解释器可能会根据情况选择不同的方式执行某些操作-是否有可用的寄存器,我们可以做一些聪明的事情,因为它下一步是如何使用的[例如,保持寄存器中计算的值]“是的,它将给你5”-而不是“是的,它也可能给你5”。即使在计算$a++之后$a是3,表达式$a++仍然计算为2,因此总和是2+2。我编辑了我的问题。我也想到了这一点,但后来意识到后增量将返回当前值(即2),然后是增量a。问题是结果是不可预测的:OP问的是如何获得5的结果,而不是它是否给出了5的结果,但随后给出了解释:“++$a给出0,$a++给出5,所以0+5=5”我也会付出同样的努力。我的意思是,两者都是反对文件的。
$result = ++$a + $a++;