当前位置: 首页 > 面试题库 >

为什么$ a + ++ $ a == 2?

益思博
2023-03-14
问题内容

如果我尝试这样做:

$a = 0;    
echo $a + ++$a, PHP_EOL;
echo $a;

我得到以下输出:

2
1

演示:http://codepad.org/ncVuJtJu

这是为什么?

我希望将其作为输出:

1
1

我的理解:

$a = 0;                    // a === 0    
echo $a + ++$a, PHP_EOL;   // (0) + (0+1) === 1
echo $a;                   // a === 1

但是为什么不输出呢?


问题答案:

所有解释为什么得到2而不是1的答案实际上都是错误的。根据PHP文档,混合+++以这种方式是不确定的行为,所以你可以得到1或2切换到不同版本的PHP可能会改变你得到的结果,这将是一样有效。

请参阅示例1,其中显示:

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

笔记:

  1. 运算符优先级 不能 确定评估顺序。运算符优先级仅确定将表达式$l + ++$l解析为$l + (++$l),而不确定+运算符的左操作数还是右运算数首先被求值。如果首先评估左操作数,则结果将为0 + 1,如果首先评估右操作数,则结果将为1 + 1。

  2. 操作员的关联性也不能确定评估顺序。该+运营商具有左结合仅确定$a+$b+$c为被评估($a+$b)+$c。它不能确定单个运算符的操作数的评估顺序。

同样相关:在此错误报告中,关于另一个表达式的结果未定义,PHP开发人员说:“我们不保证求值顺序[…]就像C语言一样。您可以指向代码中的任何位置吗?说明第一个操作数首先被评估的文档?”



 类似资料:
  • 我总是假设当执行时,优化器自然会使用有效的按位操作,就像我写了

  • 我尝试了一些代码在Java中交换两个整数,而不使用第三个变量,即使用XOR。 以下是我尝试的两个交换函数: 该代码产生的输出如下: 我很想知道,为什么会有这样的说法: 和这个不一样?

  • 问题内容: 我尝试了一些代码,使用XOR在Java中交换两个整数而不使用第三个变量。 这是我尝试的两个交换函数: 这段代码产生的输出是这样的: 我很好奇,为什么这样说: 与这个不同吗? 问题答案: 问题是评估的顺序: 参见JLS第15.26.2节 首先,对左操作数求值以产生一个变量。 如果该评估突然完成,则赋值表达式由于相同的原因而突然完成;右边的操作数不会被评估,并且不会发生赋值。 否则,将保存

  • 我有一个数组。我想对它们进行排序并删除重复项。这个答案建议使用和进行这种操作。运算的顺序不应该改变结果,所以我测量了计算的时间。 是什么使一个比另一个快?还有,有没有更快的办法呢?

  • 我正在阅读SICP的树递归,其中是通过线性递归计算的。 我们还可以制定一个迭代过程来计算斐波那契数。其思想是使用一对整数a和b,初始化为Fib(1)=1和Fib(0)=0,并重复应用同时变换 不难证明,在应用该变换n次后,a和b将分别等于Fib(n1)和Fib(n)。因此,我们可以使用该过程迭代计算斐波那契数 (由Emacs Lisp重写,代替Scheme) “设置a b=a和b=a,我很难把我的

  • 问题内容: public void push(E element) { if (size == elements.length) { resize(); // doubel of size } elements[size++] = element; } Java中的a 和 a或a–和–a有什么区别 谢谢 问题答案: 或是后缀运算符,表示a的值将在对表达式求值后更改。 或是前缀运算,表示a的值将在对