PHP 中的意外行为 - 相同的代码在 C# 和 Python 中给出正确的结果

2022-08-31 00:53:02

为什么 PHP 为以下代码段返回 INF(无穷大):

<?php
$n = 1234;
$m = 0;

while ($n > 0)
{
    $m = ($m * 10) + ($n % 10);
    $n = $n / 10;
}

var_dump($m);
?>

预期结果是 4321,但 PHP 返回 INF,浮点型:

float INF

我用Python和C#编写了相同的代码,并得到了预期的输出 - 4321

n = 1234
m = 0

while (n > 0):
    m = (m * 10) + (n % 10)
    n = n / 10

print m

C#

static void Main(string[] args)
{
    int n = 1234;
    int m = 0;

    while (n > 0)
    {
        m = (m * 10) + (n % 10);
        n = n / 10;
    }

    Console.WriteLine(m);
    Console.ReadLine();
}

答案 1

在php中将返回一个浮点数,而不是整数。$n / 10

所以将永远是.$n > 0true

改变while($n > 0)

到 或 ,那么你会得到正确的结果。while($n > 1)while((int)$n > 0)


答案 2

PHP是无类型的,并且“动态”转换。

这意味着,您$n永远不会是“0”或更低,因为在需要时,$n将是“浮动”。

尝试检查< 1,你应该没问题。

只是为了澄清这一点,$n会这样表现:

$n = 1234 $n = 123.4 $n = 12.34 $n = 1.234 $n = 0.1234 $n = 0.01234,依此类推。

含义:$n将始终接近0,但永远不会达到0。这使得$m无限,因为循环本身是无限的。


推荐