有人可以解释这段代码如何返回 4
Posted
技术标签:
【中文标题】有人可以解释这段代码如何返回 4【英文标题】:Can some one explain how this code return 4 【发布时间】:2018-12-17 19:49:18 【问题描述】:请看下面的代码,这在 php 中可以完美运行。谁能解释一下这段代码是如何工作的以及为什么它返回 4。
<?php
error_reporting(0);
$var_a = '33';
$var_b = &$var_a;
$var_c = &$var_b;
echo $var_c * ( $var_b ="2 + $var_b");
?>
本题为php程序员招聘面试。
【问题讨论】:
总而言之,我想说这是一个非常糟糕的问题,旨在试图欺骗受访者犯错 【参考方案1】:逐行分解是有益的。通过启用错误报告还可以找到更多信息,即error_reporting(E_ALL)
$var_a = '33';
很简单,将字符串"33"
分配给$var_a
。
$var_b = &$var_a;
和 $var_c = &$var_b;
将$var_b
和$var_c
都分配给$var_a
的引用地址。见http://php.net/manual/language.references.php。出于所有意图和目的,它们是具有不同名称的同一个变量。
对于下一行,我将按评估顺序将其分解为部分
"2 + $var_b"
这是一个值为"2 + 33"
的字符串。 33 来自$var_a
分配
$var_b ="2 + $var_b"
这会将前一个字符串 ("2 + 33"
) 分配给 $var_b
,然后分配给 $var_a
和 $var_c
。赋值表达式的返回值就是赋值的值。
$var_c * ( $var_b = "2 + $var_b")
你在这里留下的东西看起来像
"2 + 33" * "2 + 33"
启用错误报告后,您会得到
PHP 注意:在 ... 中遇到格式不正确的数值。
因为这显然不是一个合理的数学表达式。然而,PHP 是非常宽容的,并且会尽力评估它。发生的情况是它尝试从每个操作数中解析尽可能多的数字内容,这些操作数在"2"
之后的第一个空格处停止,所以你只剩下
"2" * "2"
感谢 PHP 的松散类型,其计算结果为 4
。
【讨论】:
【参考方案2】:$var_a
包含值 33。$var_b
包含地址 $var_a
,$var_c
包含地址 $var_b
。因此,如果您将值分配给任何变量
然后它将改变所有变量的值。
$var_b ="2 + $var_b"
在此等式中,您将 $var_b
的值 33 更改为 2,因为您正在分配 "2 + $var_b"
。在给变量$var_b
赋值时,它只会考虑2。现在所有变量的值都是2。
最终方程 $var_c * ( $var_b ="2 + $var_b")
计算为 2 * 2
返回 4
【讨论】:
请你简单解释一下我不明白的地方以上是关于有人可以解释这段代码如何返回 4的主要内容,如果未能解决你的问题,请参考以下文章
有人可以向我解释这段代码吗?我需要了解 Python for 循环的人
递归函数:有人能解释一下这段代码是如何打印 1 到 5 的吗?