我通常不会为自己创建代码,但今天(或今晚,取决于您所在的时区)我创建了一个简单的计算器代码,它可以让您输入多个数字,而不仅仅是两个项目。这是一个非常雄心勃勃的想法,所以我开始工作然后测试它,当我插入我的两个数字和我的操作员时,它回到了第一个输入(仅供参考,它是“请插入数字”提示) 并再次要求我插入一个数字,而不是像我预期的那样检查我的接线员。
#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++ 和一般编码的业余爱好者,一旦我遇到这个意想不到的怪异错误,我的想法就扭曲了(老实说,主要是因为我很不擅长调试东西)。
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;
这没有意义。