多个返回值方法因goto语句而失败

时间:2012-03-19 08:52:37

标签: c++ function goto

以下代码:

#include <cstdlib>
#include <iostream>
using namespace std;
int function(void)
{
    static int i,state=0;
    switch(state)
    {
         case 0: goto labeL0;
         case 1 :goto labeL1;         

    }

    labeL0:
    for (i = 0; i < 10; i++)
    {
        state=1;
        return i;
        labeL1:;
    }

}
int main(int argc, char *argv[])
{
    cout << function() << endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}

失败。我的意思是它只返回0而不是0,1,2,...

我只想使用label和goto语句来实现这些功能。这是为了练习(让我们说家庭作业),但我不能让它工作。这甚至可能吗?

如何使用goto和标签语句,以便此函数打印0 1 2...等等?

6 个答案:

答案 0 :(得分:4)

我不清楚你到底要做什么。如果你的目标是 jsut使用goto,最简单的解决方案是实现算法 正如你通常所做的那样,用goto替换循环结构; 即代替:

for ( int i = 0; i < 10; ++ i ) {
    std::cout << i << std::endl
}
你可以写:

    int i = 0;
    goto label1:
label2:
        std::cout << i << std::endl;
        ++ i;
label1:
        if ( i < 10 ) goto label2;

回到过去,使用Fortran IV,这就是我们实际做的事情。 今天绝对没有理由这样做(除了可能是混淆)。

但是,我想知道,如果你不想尝试静态变量 实施某种协同程序;每次调用该函数时, 你输出比前一次更高的一个。在这种情况下,我会 建议在类中维护状态,而不是使用静态 变量。此外,该函数还需要某种返回值 这样调用者就会知道它何时完成,并且调用者会知道 必须循环。像下面这样的东西可以做到这一点:

class CoRoutine
{
    int i;
public:
    CoRoutine() : i( 0 ) {}
    bool function()
    {
        if ( i < 10 ) {
            std::cout << i <<std::endl;
            ++ i;
        }
        return i < 10;
    }
};

int
main()
{
    CoRoutine c;
    while ( c.function() ) {
    }
    return 0;
}

(当然,仍然不需要goto。)

答案 1 :(得分:2)

这不起作用,因为在return语句之后,编译器将函数忽略后面的所有语句。

此外,使用标签是丑陋,可怕和不可维护的。你为什么用它们?你想要维修人员用链锯到你家吗?

答案 2 :(得分:1)

你应该使用递归调用函数来执行它,而更多地使用GOTO是我们应该避免使用goto的典型例子。

void function(void)
 {
     static int i=0;

     for(;i<10;)
     {         
         cout<<i;
         i++;
        function();
     }

}

void main()
{
 function();
}

但如果您仍想使用goto语句,请使用此

void function(void)
{
   static int i =0;
   lablelA:
   cout<<i;
   i++;
   if(i  == 10)
       return;
   goto lablelA;

}

答案 3 :(得分:1)

执行return语句后,执行从function().....

返回

所以最初当i = 0时,&#34;返回i&#34;返回0并显示在屏幕上

答案 4 :(得分:0)

跳转到labeL1正在循环中使用未初始化的变量i。这怎么可能?这只是避免转到的原因之一。

编辑:实际上,它应该可以作为某种穷人的生成器(因为静态局部变量),但仍然应该处理i&gt; = 10的情况。现在它什么也没有回来。所以你在代码中主要关注的是你需要在main中循环调用函数最多10次。

但是,这不是我想在实际代码中看到的构造。

答案 5 :(得分:0)

代码让我想起了Coroutines in C

要打印0,1等,您应该多次调用该函数。这就是重点。