4

所以我在玩弄一些 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”语句,但我的实际代码中充满了太多的 goto,我真的没有时间/耐心回去更改它们。另外,我是一个新手程序员,我发现 goto 和标签非常易于使用。

我的问题是如何预定义这些标签,以便函数 fruit() 知道它们是什么?此外,我需要在不将标签移出主要功能的情况下执行此操作。

4

4 回答 4

8

goto语句只能跳转到本地定义的标签,不能跳转到其他函数。

所以里面的标签main不会被引用,里面的goto语句fruit也找不到标签。

于 2013-05-31T07:46:11.393 回答
4

您正在尝试做的 - 在函数之间跳转 - 由于一系列原因(尤其是对象范围和生命周期)无效,请考虑:

void foo()
{
    if(feelLikeIt)
       goto foobar;
}

void bar()
{
    std::string message = "Hello";
foobar:
    cout << message << endl;
}

从 foo 跳转到 foobar 是非法的,因为“消息”将不存在。

所以简单的语言不允许你这样做。

此外,您尝试使用“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;
}
于 2013-05-31T20:43:52.420 回答
1

对不起。您不能goto使用当前执行功能之外的标签。此外,对goto. 例如,您不能使用 跳过变量定义goto。还有一些我不完全了解的。

底线?

不要使用goto.

于 2013-05-31T07:47:41.690 回答
0

goto不能用于在当前功能之外导航。尝试从函数返回一些东西并在 if else 条件下使用它。

于 2013-05-31T09:33:35.890 回答