有人可以解释这段代码如何返回 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 = &amp;$var_a;$var_c = &amp;$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 循环的人

有人可以解释这段 JavaScript 代码吗

有人能解释一下这段代码中的法线是如何计算的吗?

递归函数:有人能解释一下这段代码是如何打印 1 到 5 的吗?

有人可以解释一下这个与 Js 回调函数有关的代码吗?我对这段代码很困惑,可能是因为我是初学者。问题是:

KeyStore、HttpClient 和 HTTPS:有人可以向我解释这段代码吗?