以下代码:
#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...
等等?
答案 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等,您应该多次调用该函数。这就是重点。