#include <stdio.h>
int main(void)
{
int i = 0;
i = i++ + ++i;
printf("%d\n", i); // 3
i = 1;
i = (i++);
printf("%d\n", i); // 2 Should be 1, no ?
volatile int u = 0;
u = u++ + ++u;
printf("%d\n", u); // 1
u = 1;
u = (u++);
printf("%d\n", u); // 2 Should also be one, no ?
register int v = 0;
v = v++ + ++v;
printf("%d\n", v); // 3 (Should be the …
Run Code Online (Sandbox Code Playgroud) c increment operator-precedence undefined-behavior sequence-points
对于以下代码
<?php
$a=1; $b=$a++; var_dump($b);
$a=1; $b=$a+$a++; var_dump($b);
$a=1; $b=$a+$a+$a++; var_dump($b);
$a=1; $b=$a+$a+$a+$a++; var_dump($b);
$a=1; $b=$a+$a+$a+$a+$a++; var_dump($b);
Run Code Online (Sandbox Code Playgroud)
我得到了这个结果:
int(1)
int(3)
int(3)
int(4)
int(5)
Run Code Online (Sandbox Code Playgroud)
我预计1,2,3,4,5而不是1,3,3,4,5.$a=1; $b=$a+$a++;
我们获得后为什么$b=3
?
PHP 7.1.5-1 + deb.sury.org~xenial + 1(cli)(建于2017年5月11日14:07:52)(NTS)
php手册声称:
$a = 1;
echo ++$a + $a++;
Run Code Online (Sandbox Code Playgroud)
在它的语法下是模棱两可的,但对我来说似乎非常清楚.++ $ a和$ a ++首先从左到右计算,所以++ $ a递增然后返回2,$ a ++返回2然后递增.2 + 2的总和是4,所以它会回显4.然而,PHP手册非常清楚地说明它可以打印4或5.
php规范没有指定操作将从左到右执行吗?
即使它没有强制执行操作将从左到右执行,在这种情况下,它不会返回4无论如何?
编辑:我重读了页面,并声明它由每个特定的操作员确定.+具有最低优先级,并且从左到右进行评估,因此看起来我之前的假设是正确的.我还是不明白.
在PHP手册,运算符优先级部分,有这个例子:
// mixing ++ and + produces undefined behavior
$a = 1;
echo ++$a + $a++; // may print 4 or 5
Run Code Online (Sandbox Code Playgroud)
我理解行为是未定义的,原因如下:
由于x + y = y + x
解释器可以以任何顺序自由地评估x
和y
添加,以便优化速度和/或存储器.我在查看本文中的C代码示例后得出结论.
我的问题是上面提到的PHP代码的输出应该是4
表达式和子表达式的评估方式: