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

C++ 多返回值方法因goto语句而失败,c++,function,goto,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 =

以下代码:

#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;
}
#包括
#包括
使用名称空间std;
int函数(void)
{
静态整数i,状态=0;
开关(状态)
{
案例0:goto labeL0;
案例1:goto labeL1;
}
标签0:
对于(i=0;i<10;i++)
{
状态=1;
返回i;
标签1:;
}
}
int main(int argc,char*argv[])
{

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


此外,使用标签是丑陋、可怕和无法维护的。你为什么要使用标签?你想让维护人员带着链锯来到你家吗?

跳到标签1就是跳入一个带有未初始化变量i的循环。这怎么可能正确?这只是避免跳转的原因之一

编辑:实际上,它应该像穷人的生成器一样工作(因为存在静态局部变量),但仍然应该处理i>=10的情况。现在它什么也不返回。因此,代码中的主要问题是,在main中需要一个循环来最多调用函数10次


尽管如此,这并不是我希望在实际代码中看到的构造。

您应该使用递归调用函数来执行它,而更多关于GOTO的使用是我们应该避免使用GOTO的一个典型示例

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

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

}

void main()
{
 function();
}
void函数(void)
{
静态int i=0;

对于(;i,在执行return语句之后,执行将从函数()返回


所以最初当i=0时,“return i”返回0并显示在屏幕上,我不清楚您到底想做什么 jsut要使用
goto
,最简单的解决方案是实现算法 正如您通常所做的,用
goto
替换循环结构; i、 e.而不是:

for ( int i = 0; i < 10; ++ i ) {
    std::cout << i << std::endl
}
for(int i=0;i<10;++i){
代码让我想起了


要打印0、1等,您应该多次调用该函数。这就是关键所在。

可以说是我见过的最可怕的
goto
误用示例……做得好,先生!:)我不明白。程序应该做什么?打印0到9之间的数字?是的,你使用goto和labels@R.MartinhoFernandes:函数似乎是一个生成器,每次调用它时返回一个递增的数字。但是,它只被调用一次。@Martin James:您可能会喜欢。请注意,变量是
static
。无论
goto
如何,不初始化
i
都是一个错误,而您未能解决这个问题。我认为在这种状态下,这个答案不能帮助OP修复其功能。@LucDanton:我首先也忽略了i和state是静态的,所以这似乎起到了作用(以一种可怕的方式).@LucDanton:没有错误:
初始调用
->
状态=0
->
label0
->
i=0
。现在
i
已初始化,它是静态的,因此不需要在后续调用函数时初始化它。遗憾的是,递归和静态局部变量不能很好地协同工作。谢谢@Jeeva这样的代码我已经完成了我已经测试过很多次了,只想使用return语句,但没问题,很好!您可能想定义
operator()()
方法来创建一个函子。然后要调用
c
您可以使用
c()在没有理由的情况下,为什么会混淆呢?这里有一些仿函数成语是合适的,但是没有迹象表明这里是这样的。我会考虑名字<代码> CoRoutine <代码>一个大的赠送。你怎么称呼一个协同程序?它似乎是代码> f>(<代码> >是通常的方式和<代码>函数()。
可能有点模糊。我认为
function()
只是一个有意义的名称的占位符。你调用协同程序就像调用其他任何东西一样,如果可能的话,用一个名称来说明它的功能。
operator()
f()
function()
都是错误的选择。
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;
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;
}