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

问题描述 投票:0回答:1

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

#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(选项== y)中插入随机输入的能力)”条件。

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

c++ while-loop infinite-loop goto
1个回答
0
投票

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;
    }

}

因此,在将控制权传递给标签

anotherone
之后,while 循环将执行下一次迭代。几乎一半的程序从未获得控制权。那就是你所做的就是你得到的。

考虑到当控制传递给 if 语句时,它的 else 部分没有获得控制。它被跳过了。

使用

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

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

ans += num, secnum;

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

ans += secnum;

这没有意义。

© www.soinside.com 2019 - 2024. All rights reserved.