这里有两个要点。代码写得相当有趣,尽管理解起来很复杂。
第一点:
变量变量
如您所理解的那样,在每次交互中,
$$v
将分别转换为变量,即
$2、$3、$3、$1、$5、$2
。
PHP 非常灵活(甚至可能过于灵活),因此可以测试
if ($2)
,即使明显没有实例化
$2
。它假定其值为
NULL
,因此 if 检查未能通过。
*“注意:未定义变量:$2”将在日志中被抛出,但这不会 “破坏” 代码或阻止其执行。
第二点:
递增 / 递减运算符(
++
)
了解前置和后置递增之间的区别非常重要。
$a = 0
$b = 0
($a++ === 1) // FALSE
(++$b === 1) // TRUE
预增量操作会先加上变量的值并返回(新的、加了之后的)结果;而后增量操作会先返回变量当前的值,然后再加上一。
结合使用
为了更易读懂,让我们翻译下面这行代码。
if ($$v++) return $v;
转换为
if ($$v) {
return $v;
}
$$v = $$v + 1;
作为实际正在发生的事情,这是我们真正需要做的。
跳到第二次迭代(数组中的第一个
3
,其中
$v = 3
),我们会有:
// Right now $3 doesn't exist, so it's value is NULL
if ($3) { // "if (NULL)", so it's FALSE
return 3;
}
$3 = $3 + 1; // "NULL + 1"
// $3 === 1 at this point
为什么 PHP 编译 NULL + 1
= 1
是另一个完全不同的话题(“太灵活”了,记得吗?)。底线是假设 NULL
的 数字值 是 0
,因此解析为 0 + 1 = 1
。
现在当涉及到第三次迭代(数组中的第二个3
,其中$v = 3
,但这一次变量$3
存在且其值为1
)。
// Right now: $3 === 1
if ($3) { // TRUE
return 3;
}
$3 = $3 + 1; // This line is never reached, the code has "returned" already
所以,这就是全部了,希望它相对容易理解。这是许多不同的部分,必须结合起来才能有意义。
firstDuplicate([-1, -1])
然后炸药爆炸了。哨兵值太糟糕了。 - Alexander