【问题标题】:php: how can a similar codes results different output? [duplicate]php:相似的代码如何产生不同的输出? [复制]
【发布时间】:2018-01-22 07:08:18
【问题描述】:

上次我为我的练习做了简单的计算器,效果很好。但是今天当我再次打开代码并在浏览器中运行它时,发生了一些奇怪的事情。这是我的html代码:

<html>
<head>
<meta charset="utf-8">
<title>Calculator</title>
</head>
<body>
    <form method="post" action="disp_form.php">
        <p>First Value:<br/>
            <input type="text" id="first" name="first">
        </p>
        <p>Second Value:<br/>
            <input type="text" id="second" name="second">
        </p>
        <select method="post" name="group1">
            <option  name="group1" id="add" value="add"><p>+</p><br/>
            <option  name="group1" id="subtract" value="subtract"><p>-</p><br/>
            <option  name="group1" id="times" value="times"><p>x</p><br/>
            <option  name="group1" id="divide" value="divide"><p>/</p><br/>
        </select>
       <p></p>
       <button type="submit" name="answer" id="answer" 
           value="answer">Calculate</button>
    </form>
</body>
</html>

这是我的 php 代码

<?php
$first = $_POST['first'];
$second= $_POST['second'];
$operator = $_POST["group1"];
switch($operator)
{
    case "add":
        echo "Answer is: " .$first + $second;
        break; 
    case "subtract":
        echo "Answer is: " .$first - $second;
        break;
    case "times":
        echo "Answer is: " .$first * $second;
        break; 
    case "divide":
        echo "Answer is: " .$first / $second;
        break;
}
?>

奇怪的是,当我使用 / & * 时,输出是正确的(例如 2*5,输出是“答案是:10)。 但是当我使用 + & - 时,输出不正确。 (例如 8+5,输出为 5,对于 8-5,输出为 -5) 我认为 add 和 substract 的第一个值定义为零,这就是它的结果 -5 和 5 的原因。但是时间和除法是如何完成的呢?

【问题讨论】:

  • 把数学部分放在括号里。
  • 旁注:您从未关闭过&lt;option&gt; 标签。那是无效的 HTML。
  • 我试过放一个结束标签,但问题仍然存在。我认为错误不存在。但感谢提醒我:D@litelite

标签: php


【解决方案1】:

问题来了

echo "Answer is: " .$first + $second;

Answer is: " .$first 发生第一次连接,因为您添加了点。您需要关闭括号添加和之后需要与字符串连接,如下所示。

echo "Answer is: " . ($first + $second);

减法也会发生同样的事情。

【讨论】:

  • 代码与添加括号一起使用,但为什么除法和时间不需要括号来显示正确答案? @Thamaraiselvam
  • 因为operator precedence*/ 的优先级高于 +-.
  • 请参考这个答案stackoverflow.com/a/10841215/2975952@mgibsonbr 非常清楚地解释了运算符优先级
【解决方案2】:

问题在于它认为您正在执行字符串操作以添加到字符串输出中。在最简单的情况下,您可以将数学运算放在括号中。例如:

echo "Answer is: " .($first + $second);

或在单独的行中将它们放入另一个变量中,然后输出结果变量。您还可以将它们转换为浮点数以确保:

echo "Answer is: " .(floatval($first) + floatval($second));

【讨论】:

  • 它确实有效。现在我很好奇除法和时间如何给出不带括号的正确答案.. @ADyson
  • 我认为因为 * 和 / 具有更高的优先级,所以它不会尝试将第一个变量附加到字符串 before 它会进行数学运算,这就是发生的情况+ 和 -。如果答案有帮助,请不要忘记在选项可用后投票/标记为已接受 - 谢谢:-)
【解决方案3】:

乘法和除法运算符比串联运算符具有higher precedence,因此首先针对这些情况计算数学运算,然后合并到字符串中。

在这些情况下,代码相当于:

echo "Answer is: " .($first * $second);
echo "Answer is: " .($first / $second);

这会为您提供正确的答案。

加减运算符具有相同的优先级,并且是左结合的,所以这些行是这样执行的:

echo ("Answer is: " . $first) + $second;
echo ("Answer is: " . $first) - $second;

在这两种情况下,在数学运算之前,初始字符串都被强制转换为整数。因为字符串不以数字开头,所以相当于写了

echo 0 + $second;
echo 0 - $second;

这会导致$second 的正面或负面版本。

正如其他人所说,将数学运算括在括号中,以确保以正确的顺序计算表达式。它还将使您的代码更易于阅读。

【讨论】:

    【解决方案4】:

    您需要在 ($first + $second) 周围加上括号才能得到预期的结果。乘法和除法运算符优先于加法和减法运算符,但在 PHP 中,.添加字符串与加法和减法处于同一级别,这可能会导致意外结果。 Source

    【讨论】:

      【解决方案5】:

      这是因为 PHP 中的加法和减法运算符将这两个值都转换为 int,然后将它们相加,为了将其分解,您编写的语句被解释为 echo (int) ("Answer is: " .$first) + (int) ($second);

      要纠正这个问题,你应该先加/减,然后像下面这样连接:

      echo "Answer is: " .($first + $second);

      【讨论】:

        猜你喜欢
        • 2015-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-01
        • 2011-02-20
        • 2022-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多