带有嵌套if/else的switch语句在c++; 我为我的第一年C++编写了一个非常简单的程序,在这里我使用了开关>代码>语句,根据两个数字和它们之间的特殊字符(加、减、乘、除)来得到正确的输出。程序在除法情况下使用嵌套的if语句检查输入的第二个数字是否为零,如果没有使用正确的特殊字符,则使用default语句

带有嵌套if/else的switch语句在c++; 我为我的第一年C++编写了一个非常简单的程序,在这里我使用了开关>代码>语句,根据两个数字和它们之间的特殊字符(加、减、乘、除)来得到正确的输出。程序在除法情况下使用嵌套的if语句检查输入的第二个数字是否为零,如果没有使用正确的特殊字符,则使用default语句,c++,switch-statement,C++,Switch Statement,问题在于,如果用户除以零,或者使用了不正确的符号,控制台将显示预期的错误,但也会显示结果,而它本应只显示消息 我理解它为什么同时显示这两行,但我不知道有什么方法可以修复它。我不允许将switch语句更改为if语句,也不允许使用其他函数或数组 #包括 #包括 #包括 使用名称空间std; int main() { 字符运算符; 双操作数1=0, 操作数2=0, 结果=0; cout>操作数1>>运算符>>操作数2; cout一个简单的解决方案是使用bool标志表示操作成功,然后将其作为打印结果的条

问题在于,如果用户除以零,或者使用了不正确的符号,控制台将显示预期的错误,但也会显示结果,而它本应只显示消息

我理解它为什么同时显示这两行,但我不知道有什么方法可以修复它。我不允许将
switch
语句更改为
if
语句,也不允许使用其他函数或数组

#包括
#包括
#包括
使用名称空间std;
int main()
{
字符运算符;
双操作数1=0,
操作数2=0,
结果=0;
cout>操作数1>>运算符>>操作数2;

cout一个简单的解决方案是使用
bool
标志表示操作成功,然后将其作为打印结果的条件:

//...

bool flag = true;

switch (operatr)
{
case '+':
    result = operand1 + operand2;
    break;
case '-':
    result = operand1 - operand2;
    break;
case '*':
    result = operand1 * operand2;
    break;
case '/':
    if (operand2 == 0)
    {
        cout << operand1 << " " << operatr << " " << operand2 << " "
             << "Division by zero produces an undefined result" << endl;
        flag = false;
    }
    else
    {
        result = operand1 / operand2;
    }
    break;
default:
    cout << operand1 << " " << operatr << " " << operand2 << "  Encountered unknown operator." << endl;
    flag = false;
    break;

}
if (flag)
    cout << operand1 << " " << operatr << " " << operand2 << " = " << result << endl;

//...
/。。。
布尔标志=真;
开关(操作员)
{
格“+”:
结果=操作数1+操作数2;
打破
案例'-':
结果=操作数1-操作数2;
打破
案例“*”:
结果=操作数1*操作数2;
打破
案例“/”:
if(操作数2==0)
{
cout虽然如果有更好的替代方案,在这种情况下,我认为使用它是合适的。替代方案是代码复制或引入一个附加变量。有关避免使用附加变量而使用
goto
的解决方案,请参阅另一个答案

这是我的解决方案,它使用了
goto

int main()
{
    [...]

    default:
        cout << operand1 << " " << operatr << " " << operand2 << "  Encountered unknown operator." << endl;
        goto bad_input;
    }

    cout << operand1 << " " << operatr << " " << operand2 << " = " << result << endl;

bad_input:
    system("PAUSE>NUL");

    return 0;
}
intmain()
{
[...]
违约:

cout在这种简单的情况下,如果无法从这些输入错误中恢复,为什么不直接返回1;
而不是
break;

将错误消息合并到结果中,并仅在适当的时候填充它。最后只保留一个
cout
。尽管如果有更好的替代方法,通常不应使用e、 在这种情况下,我建议您使用它。您可以使用它跳过打印结果的
cout
行。@AndreasWenzel否。为什么?这很容易用简单的bool、错误状态或异常来解决,为什么要采取这种措施呢?goto的有效用例很少,例如高性能解析器,这绝对不是什么之中的一个them@SebastianHoffmann个人认为,<代码> Goto 比引入一个额外的(不必要的)变量要小得多。但是,我想这是一个味觉(和性能要求)的问题。@AndreasWenzel不必要?它使意图非常清晰,并且具有语义意义。你刚刚建议对一个一年级的初学者使用
goto
,他很难实现简单的控制流。想想看。你想维护他的代码吗?简单而优雅。但是如果
true
是标准,为什么不将标志初始化为true和true呢在唯一需要它的情况下,将其设置为false?@Christophe,听取了建议。请参阅我的答案,以获得一种解决方案,该解决方案通过使用(极具争议的)
goto
语句来避免引入额外变量。@AndreasWenzel忘记goto,除非您必须为unix内核编写C代码。请改用try{您的开关+打印结果}catch(){错误处理}@ AndreasWenzel,你可以在一个可以代替的地方,而不是为了更快、更容易地诱骗<代码> Goto Goto 的建议,我们可以投票否决。现代C++指南有很多解决方案,而且这个时代并没有它的位置。”凯西:是的,正如你所说的,有很多“解决办法”。对于
goto
。将这些解决方案作为答案发布是件好事。但是,为什么只对解决方案进行上选,而对非解决方案进行下选?将这两种类型的解决方案都作为答案呈现不是更合适,因为这两种解决方案的优缺点都很重要ghlighted?这就像建议使用
volatile
作为线程安全的构造,可以作为现代
std::atomic
std::condition\u变量的替代品。在C语言中,这是一种非常容易出错且“恰好工作”的老方法尽管现在不应该使用,而现代解决方案也更好。凯西:我认为用“不定义的行为”来比较<代码> Goto < />代码的使用是不合适的。使用<代码> Goto 一直被ISO C++标准所定义。我相信目前的主要问题是:“引入一个额外的变量还是引入一个goto标签更干净?”在这种情况下,我倾向于选择
goto
标签,但如果你选择相反的标签,我尊重你的意见。