PHP回显错误 - 相同的回显有些有效,有些无效

4

我有一个非常奇怪的问题:在下面的代码中,列出了4个echo,它们基本上是相同的,但只有最后一个能正常工作(前两个echo只打印加法/减法的答案,没有文字)。 以下是代码:

    <html>
<body>

Welcome <?php echo $_POST["name"]; ?><br>
Your email address is: <?php echo $_POST["email"]; ?><br>

<?php $sk1 = $_POST["sk1"];
$sk2 = $_POST["sk2"];
$veiksm = $_POST["veiksmas"];

switch($veiksm){
    default:
        echo "Jus nepasirinkote veiksmo";
        break;

    case "sud":
        echo "Sudeties veiksmo rezultatas: " .$sk1 + $sk2;
        break;

    case "ati":
        echo "Atimties veiksmo rezultatas: " .$sk1 - $sk2;
        break;

    case "dal":
        echo "Dalybos veiksmo rezultatas: " .$sk1 / $sk2;
        break;

    case "dau":
        echo "Daugybos veiksmo rezultatas: " .$sk1 * $sk2;
        break;
}

?>
</body>
</html> 

顺便说一句:如果你还没有看过,可以在这里参观一下:http://stackoverflow.com/tour,了解一下这个网站的运作方式! - Rizier123
第一个问题,4个赞。已经想出来了:D - Simone Nigro
2个回答

4
您需要在计算式周围放置括号,如下所示:
echo "Atimties veiksmo rezultatas: " . ($sk1 - $sk2);
                                     //^ See here  ^

否则,您可以将您的回声语句想象成这样:
"Sudeties veiksmo rezultatas: 17" + 5 // Same as 0 + 5, because the string is casted to int which is 0

另外,*/也可以使用,因为它们会先被计算。


好奇心:为什么会发生这种情况? - Simone Nigro
2
@SimoneNigro:由于运算符优先级 - + - .具有相同的优先级,并且从左到右进行评估。 - CBroe
@CBroe 字符串因为转换成数字操作而丢失了吗? - Simone Nigro
是的,Sudeties veiksmo rezultatas: 17 被转换为数字值(以便可以添加其他内容),结果为0。 - CBroe
@SimoneNigro 是的!它是从左到右在字符串中搜索数字!所以尝试这个:echo (int)"Sudeties veiksmo rezultatas: 17" ; 你会得到0,但这个 echo (int)"17Sudeties veiksmo rezultatas: 17" ; 将会得到17。 - Rizier123

1
在计算时加上括号,像这样:
echo "Sudeties veiksmo rezultatas: " . ($sk1 + $sk2);

这是因为表达式处理的顺序。没有括号,PHP按照从左到右的顺序评估所有内容,所以它首先将$sk1连接到字符串中。组合值将是"Sudeties veiksmo rezultatas: 1"(如果$sk1为1)。
之后,$sk2添加到该值中。因为PHP无法将字符串相加,它尝试将其转换为数字。此转换失败,因为该字符串以非数字文本开头,并默认为0,然后将其添加到$sk2的值中。
乘法和除法运算符具有更高的优先级,因此它们首先进行评估,覆盖从左到右的顺序。这就是为什么最后两种情况有效的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接