为什么这在PHP中给出0?

时间:2014-04-16 19:03:17

标签: php function logic

<?php
  function a($n){
    return ( b($n) * $n);
  }

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

  echo a(5);

  ?>

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

我不是php的开发者,所以任何帮助都会受到赞赏。

3 个答案:

答案 0 :(得分:7)

代码提供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(&$n)的工作原理;如果签名为function b($n),则结果为30。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

尝试在b()定义的末尾添加“return 1”,结果应该等于 n