Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的;除以零“;预防不起作用?_C# - Fatal编程技术网

C# 为什么我的;除以零“;预防不起作用?

C# 为什么我的;除以零“;预防不起作用?,c#,C#,我一直在用C#编写计算器,遇到了一个我过去无法解决的问题 当前,当用户输入一个被零除的数字时,答案默认为0.00,而实际上它应该是无效的 我不知道为什么,经过一段时间的修修补补,我一直没能弄明白。以下是相关代码: private void button1_Click(object sender, EventArgs e) { double number1, number2, ans; // Identify variables as double to accou

我一直在用C#编写计算器,遇到了一个我过去无法解决的问题

当前,当用户输入一个被零除的数字时,答案默认为0.00,而实际上它应该是无效的

我不知道为什么,经过一段时间的修修补补,我一直没能弄明白。以下是相关代码:

private void button1_Click(object sender, EventArgs e)
{
                double number1, number2, ans; // Identify variables as double to account for decimals.
                number1 = Convert.ToDouble(num1.Text); // Convert the contents of the textBox into a double.
                number2 = Convert.ToDouble(num2.Text); // 
                ans = 0.0;
                string symbol = modifier1.Text;

                if (symbol == "/" && number2 == 0) // This part seems to be broken.
                    answer.Text = "Invalid input.";
                else
                    if (symbol == "+")
                        ans = number1 + number2;
                    else if (symbol == "-")
                        ans = number1 - number2;
                    else if (symbol == "/")
                        ans = number1 / number2;
                    else if (symbol == "*")
                        ans = number1 * number2;
                    else
                        ans = 0;

                    answer.Text = ans.ToString("n"); // Change label value to a number.
}
有人对我如何解决这个问题有什么想法吗?这似乎很直截了当,但我遗漏了一些东西。

改变这一点:

if (symbol == "/" && number2 == 0) // This part seems to be broken.
                answer.Text = "Invalid input.";
致:

说明: 代码中“if”子句中的条件是正确的。它执行预期的操作-它将answer.Text属性更改为“Invalid input”,但稍晚一点,它在此行上再次更改:

answer.Text = ans.ToString("n"); // Change label value to a number.
并且因为'if'子句中的条件返回true-'else'块未执行。这就是为什么会看到0.00(double类型的默认值)

附言。 所以,通过在if子句中添加
return
语句,基本上就结束了方法。 这就像你对编译器说:“嘿,如果这个家伙试图
除以零
警告他'Ivalid input',什么都不做,从方法返回。”*

另一种解决方法是:

if (divide by zero attempt) { your code here } else
{
    and place rest of your method code here
}
但我不建议这样做,因为它使用了多余的else语句和{}数字。在本例中使用if(){……;return;}可以避免所有这些情况

使用
switch
block也会使您受益匪浅,您的代码可能会被重构为:

double number1, number2, ans; // Identify variables as double to account for decimals.
number1 = Convert.ToDouble(num1.Text); // Convert the contents of the textBox into a double.
number2 = Convert.ToDouble(num2.Text); // 
ans = 0.0;
string symbol = modifier1.Text;

if (symbol == "/" && number2 == 0) { answer.Text = "Invalid input."; return;}
switch(symbol)
{
   case "+": ans = number1 + number2; break;
   case "-": ans = number1 - number2; break;
   case "*": ans = number1 * number2; break;
   case "/": ans = number1 / number2; break;
   default : answer.Text = "Invalid sign."; return;
}                

answer.Text = ans.ToString("n"); // Change label value to a number.

为了帮助您理解出现了什么问题,它有助于按照编译器看到的方式而不是按照您想象的方式对代码进行布局:

double number1, number2, ans; // Identify variables as double to account for decimals.
number1 = Convert.ToDouble(num1.Text); // Convert the contents of the textBox into a double.
number2 = Convert.ToDouble(num2.Text); // 
ans = 0.0;
string symbol = modifier1.Text;

if (symbol == "/" && number2 == 0) // This part seems to be broken.
    answer.Text = "Invalid input.";
else if (symbol == "+")
    ans = number1 + number2;
else if (symbol == "-")
    ans = number1 - number2;
else if (symbol == "/")
    ans = number1 / number2;
else if (symbol == "*")
    ans = number1 * number2;
else
    ans = 0;

answer.Text = ans.ToString("n"); // Change label value to a number.
因此,当出现被零除的情况时,首先
answer.Text
被设置为“Invalid input.”,然后控制流下降到最后一行,并被
0.0
覆盖

这篇文章巧妙地强调了为什么即使对于单个语句,使用
{}
也非常重要。这样做,代码将按预期工作:

double number1, number2, ans; // Identify variables as double to account for decimals.
number1 = Convert.ToDouble(num1.Text); // Convert the contents of the textBox into a double.
number2 = Convert.ToDouble(num2.Text); // 
ans = 0.0;
string symbol = modifier1.Text;

if (symbol == "/" && number2 == 0) // This part seems to be broken.
{
    answer.Text = "Invalid input.";
}
else 
{
    if (symbol == "+")
    {
        ans = number1 + number2;
    }
    else if (symbol == "-")
    {
        ans = number1 - number2;
    }
    else if (symbol == "/")
    {
        ans = number1 / number2;
    }
    else if (symbol == "*")
    {
        ans = number1 * number2;
    }
    else
    {
        ans = 0;
    }

    answer.Text = ans.ToString("n"); // Change label value to a number.
}

在这里查看C中if-else条件的基本信息#

您缺少
返回的
或大括号。请使用调试器进行确认。还要确保你清楚你所使用的语言规则-C#不像其他语言那样使用明显的空格。@说谢谢。我在我的答案更新中解释了它。@DavidArno-Else语句在操作代码中是正确的,因为它只有一个if子句,没有更多。像这样:elseif(symbol==“+”)//somecode//elseif等等。检查我的答案更新它解释了一切。很好的解释,谢谢!
double number1, number2, ans; // Identify variables as double to account for decimals.
number1 = Convert.ToDouble(num1.Text); // Convert the contents of the textBox into a double.
number2 = Convert.ToDouble(num2.Text); // 
ans = 0.0;
string symbol = modifier1.Text;

if (symbol == "/" && number2 == 0) // This part seems to be broken.
{
    answer.Text = "Invalid input.";
}
else 
{
    if (symbol == "+")
    {
        ans = number1 + number2;
    }
    else if (symbol == "-")
    {
        ans = number1 - number2;
    }
    else if (symbol == "/")
    {
        ans = number1 / number2;
    }
    else if (symbol == "*")
    {
        ans = number1 * number2;
    }
    else
    {
        ans = 0;
    }

    answer.Text = ans.ToString("n"); // Change label value to a number.
}