提问人:aidiotwholikescoding 提问时间:4/16/2023 最后编辑:Vlad from Moscowaidiotwholikescoding 更新时间:4/22/2023 访问量:72
Goto 函数似乎循环了代码的前半部分
Goto function seems to loop the first half of the code
问:
我通常不会为自己创建代码,但今天(或今晚,取决于您的时区)我创建了一个简单的计算器代码,可让您输入多个数字,而不仅仅是两个项目。这是一个非常雄心勃勃的想法,所以我开始工作,然后我测试了它,当我插入我的两个数字和我的运算符时,它又回到了第一个输入(仅供参考,这是“请插入一个数字”提示)并要求我再次插入一个数字,而不是像我预期的那样检查我的运算符它能工作。
#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++和一般编码的业余爱好者,一旦我遇到这个意想不到的奇怪错误,我的思想就会扭曲(主要是因为我不擅长调试东西,说实话)。
答:
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;
这没有意义。
评论
goto
不是一个函数,通常应避免使用循环构造。goto anotherone;
可以替换为 ,因为标签后面没有更多的语句。但是,由于这是无条件完成的,因此在此之后的循环体中的任何代码都是无关紧要的,并且永远不会执行。避免将意大利面与代码混合...continue;
anotherone
goto