所以我一直在使用一些C ++,并使用一些类似的代码得到了之前声明的错误:
#include <iostream>
using namespace std;
char foodstuffs;
void fruit()
{
cin>>foodstuffs;
switch(foodstuffs)
{
case 'a': goto foo; break;
case 'b': goto fooo; break;
}
}
int main()
{
cout<<"What do you want to eat? (a/b)";
fruit();
foo: cout<<"You eat an apple.";
fooo: cout<<"You eat a banana.";
}
确切的代码要复杂得多,但这只是为了向您展示我得到的错误。
现在我意识到每个人都出于某种原因鄙视“goto”声明,但是我的实际代码中充满了很多东西,我没有时间/耐心回去改变它们。另外,我是一个新手程序员,我发现很难使用的东西和标签。
我的问题是如何预定义这些标签,以便函数fruit()知道它们是什么?另外,我需要在不将标签移出主函数的情况下执行此操作。
答案 0 :(得分:7)
goto
语句只能转到本地定义的标签,不能跳转到其他功能。
因此main
中的标签不会被引用,goto
中的fruit
语句将找不到标签。
答案 1 :(得分:4)
你尝试做什么 - 在函数之间跳转 - 由于一系列原因无效,尤其是对象范围和生命时间,请考虑:
void foo()
{
if(feelLikeIt)
goto foobar;
}
void bar()
{
std::string message = "Hello";
foobar:
cout << message << endl;
}
从foo跳到foobar是非法的,因为“message”将不存在。
所以简单的语言不允许你这样做。
此外,您尝试使用“goto”的方式会阻止您重新使用“fruit()”函数,因为它总是决定如何处理选择而不是调用它的函数。如果你想这样做怎么办:
cout<<"What do you want to eat? (a/b)";
fruit();
foo: cout<<"You eat an apple.";
fooo: cout<<"You eat a banana.";
cout<<"What does your friend want to eat? (a/b)";
fruit();
// oops, you just created a loop because fruit made the decision on what to do next.
您实际上想要做的是使用“fruit()”作为返回值的函数。
enum Fruit { NoSuchFruit, Apple, Banana };
Fruit fruit(const char* request)
{
char foodstuffs;
cout << request << " (a/b)";
cin >> foodstuffs;
switch (foodstuffs)
{
case 'a': return Apple;
case 'b': return Banana;
default:
cout << "Don't recognize that fruit (" << foodstuffs << ")." << endl;
return NoSuchFruit;
}
}
const char* fruitNames[] = { "nothing", "an apple" ,"a banana" };
int main()
{
Fruit eaten = fruit("What do you want to eat?");
cout << "You ate " << fruitNames[eaten] << "." << endl;
eaten = fruit("What does your friend want to eat?");
cout << "Your friend ate " << fruitNames[eaten] << "." << endl;
}
答案 2 :(得分:1)
对不起。您不能goto
到当前执行函数之外的标签。此外,goto
的使用还有其他限制。例如,您不能使用goto
跳过变量定义。还有一些我不太清楚的事情。
底线?
goto
。答案 3 :(得分:0)
goto
不能用于在当前函数之外导航。尝试从函数返回一些东西,并在if else条件下使用它。