为啥这在php中给出0? [关闭]

Posted

技术标签:

【中文标题】为啥这在php中给出0? [关闭]【英文标题】:Why this gives 0 in php? [closed]为什么这在php中给出0? [关闭] 【发布时间】:2014-05-31 19:56:58 【问题描述】:
<?php
  function a($n)
    return ( b($n) * $n);
  

  function b(&$n)
    ++$n;
  

  echo a(5);

  ?>

我这个星期天做了一次考试,想知道为什么这段代码的输出是 0

我不是 php 的开发人员,因此我们将不胜感激。

【问题讨论】:

当我运行它时,我得到 36 可以验证,see the demo a(-1) 为 0,否则为 0 对不起,我与我正在处理的其他代码混合,正确的代码已更新。 【参考方案1】:

代码给出0,因为它缺少return。与以下(如所示更正后)产生36的比较,正如另一个答案中所推理的那样。

function a($n)
  // Since b($n) doesn't return a value in the original,
  // then NULL * $n -> 0
  return ( b($n) * $n);


function b(&$n)
  // But if we return the value here then it will work
  // (With the initial condition of $n==5, this returns 6 AND
  //  causes the $n variable, which was passed by-reference,
  //  to be assigned 6 such that in the caller 
  //  it is 6 * $n -> 6 * 6 -> 36).
  return ++$n;


echo a(5);

请参阅Passing by Reference,了解上述function b(&amp;$n) 的工作原理;如果签名是function b($n),则结果将是 30。

【讨论】:

为什么是-1?没错……没有回报使它返回null。 +1 这是正确的。 +1。 b 当然会更改 $n 的值,但不会带来 OP 假设我假设的更改值(因为未返回)。 @Lekhnath 根据其他答案,该变量仍会更改。这就是为什么结果是 36,而不是 30。 @user2864740,谢谢!现在我明白了我的错误。 @ValterHenrique 酷,有时最简单的事情最容易被忽略。【参考方案2】:
function a($n) 
    return (b($n) * $n);


function b(&$n)
    ++$n;


echo a(5);

这是调用echo a(5);时会发生的情况(不是按实际顺序,只是为了演示):

return (b($n) * $n);

这个返回语句有两部分:b($n)$nb($n) 是对函数 b 的调用。函数b 通过引用接受其参数并将值增加1。请注意,它不返回值

由于它不返回值,b($n) 将是NULL。证明:

function a($n)
    $v = b($n);
    var_dump($v);
    return (b($n) * $n);

输出:

NULL

在下一步中,将b($n)(即NULL)的结果与$n(等于6)相乘。

所以结果是NULL * 0。结果是什么?使用var_dump()

var_dump(NULL * 6);

输出:

int(0)

如果你在b 中返回一个值,一切都会好起来的:

function a($n)
    return (b($n) * $n);


function b(&$n)
    return ++$n;


echo a(5);

输出:

36

【讨论】:

【参考方案3】:

默认情况下,在 PHP 中,return 语句等于 NULL / 0。 因此,即使 b() 函数通过引用更改 n 的值,return 语句也等于 null。 然后,当你将这个返回语句乘以(等于零)乘以任意数字时,它将等于零。

尝试在b()定义的最后加上'return 1',结果应该等于n

【讨论】:

以上是关于为啥这在php中给出0? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个程序会在 C 中给出 Invalid memory access 错误? [关闭]

为啥“继续”和“中断”会给出相同的结果? [关闭]

为啥 Arrays.toString() 会给出与手动打印数组不同的输出? [关闭]

为啥此代码会给出错误 Expected ',' 分隔符? [关闭]

为啥在php中调用now()失败[关闭]

为啥我应该在 PHP 中使用模板系统? [关闭]