c 语言goto语句死循环

#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int i;
num:printf ("a ");
for (i = 0;i < 10;++i)
{
goto num;
}
system ("pause");
return 0;
}
请问为什么会出现死循环啊,希望详细讲解一下goto语句的用法。谢谢!

执行到"goto代码"的时候,程序会自动跳到goto后面跟着的字符标志处,即"num"处..
但是"num"处位于"goto"代码之前,因此跳到了"num"的代码处向下走,会又一次碰到goto..
如此循环反复..因此会变为死循环...

另外goto语句的用法就是 goto+标志, 如题中例子 num就是"标志",当执行到goto的时候,会直接跳到"标志"的地方,在标志处继续向下执行..
c中的这个用法很常见,比如执行到某个地方用"goto"跳到另外一个地方接着执行.然后再用"goto"跳回来..
注:其中的标志可以任意设置,标志之间名字尽量不要重复.追问

非常详细,num:printf ("hello");在没用goto语句调用它标号的时候他也会执行一次吗?
#include
#include
int main (void)
{
num:printf ("hello\n");
goto num;//请问怎么才能让goto只跳转一次呀,谢谢!
system ("pause");
return 0;
}

追答

问题1:num:printf ("hello");在没用goto语句调用它标号的时候他也会执行一次吗?
答:会执行的.这个语句是正常的代码 只不过加了一个标志,这个标志并不对代码造成任何影响.

问题2:请问怎么才能让goto只跳转一次.
答:goto本身就只是跳转代码的功能,如果硬要让他只执行一次,那就加个if条件语句好了..
#include
#include
int main (void)
{
int n=0;
num:printf ("hello\n");
n++;
if(n<2) goto num;
system ("pause");
return 0;
}
//第一次执行到num处时,打印"hello\n",接着n++为1,符合if条件,进行goto跳转到num,打印"hello\n",然后n++为2,不符合if条件..不进行goto了... 完成只跳转一次的功能!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-10-15
goto 的功能:
每次执行到这句:goto 标记;程序会跳到 有标记的那句代码,如上面的:num:printf ("a ");

上述之所以会死循环是因为:运行到 goto num; —> num:printf("a"); —> for( i = 0; i < 10; ++i ) { }
此处会 i = 0(始终)。

可以这样改:
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int i = 0;
num:
{
printf ("a ");
}
for ( ;i < 10; )
{
++i;
goto num;
}
system ("pause");
return 0;
}

这样改了之后还是不好,for() 循环语句的功能没有很好的体现(goto 跳出了for(语句1;语句2;语句3 ) 循环是不会执行 语句3 的)。
goto太灵活了,容易使得程序结构变乱(不知道跳过了那些语句)。
程序的调式建议使用 VC 的断点。
第2个回答  2012-10-15
你的for循环每次初始i=0;然后进来goto num,这样每次for循环中的判断i都是0<10,所以就是死循环。
所以说一定要把判断条件的初始化放在循环开始之前。
此处应该把i = 0的赋值放在num前面
第3个回答  2012-10-15
只要向前并且没有条件的goto都是死循环。
num:
...
goto num;
执行到这句就回到前面执行。这不就是标准的死循环吗。
goto一般都是有条件的goto。比如:
if (error) goto ERROR;

ERROR:
错误处理
这样判断某种错误后就直接转到错误处理去,不要再做其他工作了。
第4个回答  2012-10-15
当执行到goto num;,程序就会跳转回到num:printf ("a ");然后又继续向下执行,如此反复循环下去追问

程序执行到goto num的时候就直接跳出for循环啦?有什么办法能让goto在for循环里执行goto语句后面的部分呀?谢谢!