Goto 函数似乎循环了代码的前半部分

Goto function seems to loop the first half of the code

提问人:aidiotwholikescoding 提问时间:4/16/2023 最后编辑:Vlad from Moscowaidiotwholikescoding 更新时间:4/22/2023 访问量:72

问:

我通常不会为自己创建代码,但今天(或今晚,取决于您的时区)我创建了一个简单的计算器代码,可让您输入多个数字,而不仅仅是两个项目。这是一个非常雄心勃勃的想法,所以我开始工作,然后我测试了它,当我插入我的两个数字和我的运算符时,它又回到了第一个输入(仅供参考,这是“请插入一个数字”提示)并要求我再次插入一个数字,而不是像我预期的那样检查我的运算符它能工作。

#include <iostream>
#include <cstring>
using namespace std;

int main() {
    int ans=0, num=0, secnum=0;
    char oper, option;
    bool statcheck = false;

    while(!statcheck) {
        cout<<"Please insert a number."<<endl;
        cin>>num;
        cout<<"Please insert another number."<<endl;
        cin>>secnum;
        cout<<"Select the operator you would like to use."<<endl;
        cin>>oper;
        switch(oper) {
            case '+':
                ans += num, secnum;
                break;
            case '-':
                ans -= num, secnum;
                break;
            case '*':
                ans *= num, secnum;
                break;
            case '/':
                ans /= num, secnum;
                break;
            case '%':
                ans %= num, secnum;
                break;
            default:
                cout<<"Error."<<endl;
                break;
        }
        goto anotherone;
        cout<<"Would you like to add another number to the equation? (Y for yes, any other number for no)"<<endl;
        cin>>option;
        toupper(option);
        if (option == 'Y') {
            goto there;
            secnum=0;
            cout<<"What number would you like to add to the equation?"<<endl;
            cin>>secnum;
            cout<<"Select the operator you want to use."<<endl;
            cin>>oper;
            switch(oper) {
                case '+':
                    ans += secnum;
                    break;
                case '-':
                    ans -= secnum;
                    break;
                case '*':
                    ans *= secnum;
                    break;
                case '/':
                    ans /= secnum;
                    break;
                case '%':
                    ans %= secnum;
                    break;
                default:
                    cout<<"Error."<<endl;
                    there:;
                    break;

            }
            anotherone:;

        } 
        else {
            cout<<ans;
            statcheck = true;
        }

    }
}

这似乎是我在代码中使用的 goto 函数的问题,因为当我删除它们时,它工作得很好,减去在“if (option == y)”条件下阻止用户插入随机输入的能力。

我期望它能完美地执行:它会要求两个数字,运算符,询问他们是否想在等式中添加另一个数字,然后它会给出答案。但是,当然,作为一个C++和一般编码的业余爱好者,一旦我遇到这个意想不到的奇怪错误,我的思想就会扭曲(主要是因为我不擅长调试东西,说实话)。

C++ While-Loop 无限循环 goto

评论

8赞 πάντα ῥεῖ 4/16/2023
goto不是一个函数,通常应避免使用循环构造。
1赞 πάντα ῥεῖ 4/16/2023
使用调试器逐行执行代码,以掌握实际情况。
0赞 Pepijn Kramer 4/16/2023
避免 goto,你可以使用 break 来打破循环。
0赞 Pepijn Kramer 4/16/2023
stackoverflow.com/questions/46586/goto-still-considered-harmful
1赞 fabian 4/16/2023
goto anotherone;可以替换为 ,因为标签后面没有更多的语句。但是,由于这是无条件完成的,因此在此之后的循环体中的任何代码都是无关紧要的,并且永远不会执行。避免将意大利面与代码混合...continue;anotheronegoto

答:

0赞 Vlad from Moscow 4/16/2023 #1

goto 语句将控件传递给 while 循环的内部 if 语句中的标签。事实上,你有:notherone

while(!statcheck) {
    cout<<"Please insert a number."<<endl;
    cin>>num;
    cout<<"Please insert another number."<<endl;
    cin>>secnum;
    cout<<"Select the operator you would like to use."<<endl;
    cin>>oper;
    switch(oper) {
        case '+':
            ans += num, secnum;
            break;
        case '-':
            ans -= num, secnum;
            break;
        case '*':
            ans *= num, secnum;
            break;
        case '/':
            ans /= num, secnum;
            break;
        case '%':
            ans %= num, secnum;
            break;
        default:
            cout<<"Error."<<endl;
            break;
    }
    goto anotherone;
    //...
    if (option == 'Y') {
        //....
        anotherone:;
    } 
    else {
        cout<<ans;
        statcheck = true;
    }

}

因此,在将控件传递给标签后,while 循环将执行其下一次迭代。几乎一半的程序从未获得控制权。这就是你所做的,就是你所得到的。anotherone

请注意,当控件传递给 if 语句时,其 else 部分不会获取控件。它被跳过。

使用语句是一种糟糕的编程风格。它使代码不可读。goto

在这样的陈述中要注意这一点:

ans += num, secnum;

有使用逗号运算符的表达式。实际上,显示的语句等效于:

ans += secnum;

这没有意义。