Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php echo+的输出应该是什么+$a和x2B$a和x2B+;_Php_Operator Precedence_Post Increment_Pre Increment - Fatal编程技术网

Php echo+的输出应该是什么+$a和x2B$a和x2B+;

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++=

在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++=>op2=2,$a=3;2+2=4
  • op1=$a++=>op1=1,$a=2;op2=+$a=>op2=3,$a=3;1+3=4
5是从哪里来的?或者我应该更多地了解操作员是如何工作的

编辑:

我一直盯着这一部分,但仍然不明白为什么

++$a:Pre increment——将$a增加一次,然后返回$a。
$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++;