php - 理解条件求解优先级中的赋值

标签 php loops expression variable-assignment

<分区>

今天在工作中,我被一行代码困住了,我无法理解。 我在 JavaScript 中有一个函数,为了确保获得唯一的时间戳,我执行了那个丑陋的循环:

var ts = +new Date();
while (ts === (ts = +new Date()));

我认为很清楚我们正在重新设置 ts 直到它的值变得不同。

但是当我尝试将函数迁移到 PHP 代码时 - 就像那样:

$ts = preg_replace('/^\d\.(\d+)\s(\d+)$/', '$2$1', microtime());
//regex extracts digits and re-positions them - ugly microtime :(
while ($ts === ($ts = preg_replace('/^\d\.(\d+)\s(\d+)$/', '$2$1', microtime())));

解释器进入无限循环。我所有的尝试似乎都指出 $ts 赋值是在比较之前进行的,但我不明白为什么没有首先解决左侧表达式。我对 PHP 的了解不如我对 JavaScript 的了解,所以我想知道是否有一些关于 PHP 表达式和语句的关键提示我正在泄露。

建议:我不想通过制作“构造良好”的循环来修复我的代码 - 解决方案很明显 - 我很想了解这里发生的事情。非常感谢所有帮助。

最佳答案

PHP 需要先评估赋值,然后才能进行比较。通常,赋值运算符的优先级非常低,因此当您编写 $a = $b + $c 时,先计算加法,然后再将结果赋值给 $a。 然而,这是一个特例,虽然它似乎没有被很好地记录下来,但在文档中找到了类似的案例,说明:

Although = has a lower precedence than most other operators, PHP will still allow expressions similar to the following: if (!$a = foo()), in which case the return value of foo() is put into $a.

所以在这种情况下,PHP 确定它需要进行赋值,然后才能否定赋值的结果。我认为这里发生了类似的事情,尽管你是对的,PHP 应该能够稍后进行分配。

实际上,结果可能是不可预测的,就像其他一些表达式一样:

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

关于php - 理解条件求解优先级中的赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13503044/

相关文章:

php - 从另一个对象向 stdClass 对象添加属性

php - 使用 wordpress xmlrpc API 的最简单的库是什么

c++ - 为什么这段代码给我一个无限循环?

c# - 循环中的局部范围矛盾

javascript - 获取变量函数表达式的名称?

python - CVXPY 表达式未给出预期结果

php - mysqli_query() 期望参数 2 为字符串

php - 如何从 PHP 中的索引数组创建多维数组?

c - 为什么在循环外部和内部声明具有相同名称的变量不会产生错误?

R - 如何从表达式中提取对象名称