为啥这在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(&$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)
和$n
。 b($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() 会给出与手动打印数组不同的输出? [关闭]