返回函数开头的方法

时间:2009-06-30 03:28:59

标签: c++

C ++是否有任何类型的实用程序在函数调用后返回函数的开头?例如,在calculate函数中调用help()。

void help()
{
     cout << "Welcome to this annoying calculator program.\n";
     cout << "You can add(+), subtract(-), multiply(*), divide(/),\n";
     cout << "find the remainder(%), square root(sqrt()), use exponents(pow(x,x)),\n";
     cout << "use parentheses, assign variables (ex: let x = 3), and assign\n";
     cout << " constants (ex: const pi = 3.14). Happy Calculating!\n";
     return;
}

void clean_up_mess()        // purge error tokens
{
    ts.ignore(print);
}

const string prompt = "> ";
const string result = "= ";

void calculate()
{
    while(true) try {
        cout << prompt;
        Token t = ts.get();
        if (t.kind == help_user) help();  
        else if (t.kind == quit) return;
        while (t.kind == print) t=ts.get();
        ts.unget(t);
        cout << result << statement() << endl;
    }
    catch(runtime_error& e) {
        cerr << e.what() << endl;
        clean_up_mess();
    }
}

虽然技术上我的帮助功能的实现工作正常,但它并不完美。在调用帮助并返回之后,它继续尝试cout&lt;&lt;结果&lt;&lt; statement()&lt;&lt; ENDL;这是不可能的,因为没有输入任何值。因此,它给出了一个小错误消息(程序中的其他地方),然后继续该程序。没有功能问题,但它很难看,我不喜欢它(:P)。

那么有什么方法可以帮助函数返回,返回到计算的开始并重新开始? (我在if(t.kind == help_user)块中插入一个函数调用来调用calculate,但是我认为这只会延迟问题而不是解决问题。)

4 个答案:

答案 0 :(得分:5)

这可能就是你要找的东西?

if (t.kind == help_user) {
    help();  
    continue;
}

答案 1 :(得分:5)

你可以使用goto,但是当你这样做时,请考虑自己。它被认为是不好的做法,它的良好用途是罕见的,相距甚远。

我认为您正在寻找的是:

void do_calculate(void)
{
    while (true)
    {
        cout << prompt;
        Token t = ts.get();

        if (t.kind == help_user)
        {
            help();  
            continue; // <- here
        }
        else if (t.kind == quit)
        {
            return;
        }

        while (t.kind == print)
        {
            t = ts.get();
        }
        ts.unget(t);

        cout << result << statement() << endl;
    }
}

void calculate()
{
    try
    {
        do_calculate();
    }
    catch (const std::exception& e)
    {
        cerr << e.what() << endl;
        clean_up_mess();
    }
}

我还重新格式化了你的代码。我认为这对他自己来说更具可读性,但只是想让你进行比较。

  • try / catch子句现在不再干扰计算功能。

  • 'if'语句使用括号表示一致性。此外,它更容易阅读,因为我知道无论控制是否在这些括号内。

  • catch将捕获std :: exception,而不是runtime_error。所有标准异常都继承自std :: exception,因此通过捕获,您知道可以捕获任何内容。

答案 2 :(得分:2)

您可以使用continue语句返回循环的顶部。这是实现所需内容的最简单方法,因为您的代码周围有while循环:

if (t.kind == help_user) {
    help();
    continue;
}

还有goto声明,但这几乎总是一个坏主意。我会把它留给你自己阅读。有关“控制流程”的更多信息,请阅读。

在这个特定的例子中,我可能会选择通过添加else语句来稍微重构您的代码,如下所示:

    if (t.kind == help_user)
        help();  
    else if (t.kind == quit)
        return;
    else {
        while (t.kind == print)
            t=ts.get();
        ts.unget(t);

        cout << result << statement() << endl;
    }

答案 3 :(得分:1)

是的,它被称为逻辑:

void calculate()
{
    while(true)
    {
    try {
        cout << prompt;
        Token t = ts.get();
        if (t.kind == help_user)
            help();  
        else
        {
            if (t.kind == quit) return;
            while (t.kind == print) t=ts.get();
            cout << result << statement() << endl;
        }
        ts.unget(t);  // if statement above needs this then leave it in and 
                      // add one call after help() as well ... not sure from code
    }
    catch(runtime_error& e) {
        cerr << e.what() << endl;
        clean_up_mess();
    }
}