扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
goto 语句是最经典的计算机语句,叫“无条件转向语句”,执行到它,无条件地跳到指定的标号所在地。
汉寿ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!
下面程序读入fin_list的一行,每一行是一个文件名。
[许多语句] 用来处理一个文件,处理完了goto entrance 又回到开始,再读一个文件名。读到fin_list结束,goto No_More,跳到No_More:
退出这段程序。
entrance:
if ( fgets(one_line,200,fin_list) ==NULL) goto No_More;
....[许多语句]
....
goto entrance;
No_More: fclose(fin_list);
转向语句与标号配合使用。函数块里,标号名不可重名,(标号名如同路标)。例如,可以有多个 goto No_More 语句,但只可有 一个No_More:;
转向语句只能从程序内层转向同一层或外层,但不可转向它的内层。
例如(正确的):
for (j=0;jn;j++){
Lab1:;
for (i=0;im;i++){
...
if (..) goto Lab1;
if (..) goto Lab2;
if (..) goto Lab3;
if (..) goto Lab4;
Lab2:;
...
}
...
Lab3:;
}
Lab4:;
例如(错的):
for (j=0;jn;j++){
if () goto Lab1:;
for (i=0;im;i++){
...
Lab1:;
...
}};
goto 不可跳出自己在的函数块。
这个问题很有意思。说说我的猜测吧,不一定对。
{
int y = 3;
a:
...
}
这是一个类似一个小函数的作用域,int y = 3;在编译的时候会被拆分成 int y; y = 3;两条语句。
int y;这是定义一个局部变量,在函数压栈的时候就给他分配了地址,这个作用域使用y的时候会从这个地址取值,而不是上边定义的那个int y=0; 而用goto语句跳到 标签a的时候,就会把y=3这条语句给跳过了,所以此时y的值是一个随机数。
以上观点纯粹为个人猜测,如有不对望指正
goto语句是一种无条件转移语句,与BASIC中的goto语句相似。goto语句的使用格式为:goto 标号;
其中标号是Turbo C2.0中一个有效的标识符,这个标识符加上一个:一起出现在函数内某处,执行 goto
语句后,程序将跳转到该标号处并执行其后的语句。标号既然是一个标识符,也就要满足标识符的命名规则。另外标号必须与goto 语句同处于一个函数中,但可以不在一个循环层中。通常goto语句与if条件语句连用,当满足某一条件时,程序跳到标号处运行。goto语句通常不用,主要因为它将使程序层次不清,且不易读,但在多层嵌套退出时,用goto语句则比较合理。
goto语句可以使程序在没有任何条件的情况下跳转到指定的位置,所以goto语句又被称为是无条件跳转语句。
它的语法如下
goto label;
//其它代码
label:
其中,label为我们自己定义的一个标签,定义的规则与变量的命名相同,它的位置是不固定的,它可以写在goto语句的后面,也可以写在它的前面,然而goto语句只能在一个函数内部跳转,它并不允许跳转出一个函数外部。
int day = 1;
loop:
if (day = 31)
{
printf("%d\n", day);
day++;
goto loop;
}
上面程序就是利用了goto和if语句来实现了循环功能,它与while实现的循环功能一样,其中loop为我们定义的一个label(标签)。
扩展资料:
使用goto语句的建议
1) 使用goto语句只能goto到同一函数内,而不能从一个函数里goto到另外一个函数里。
2) 使用goto语句在同一函数内进行goto时,goto的起点应是函数内一段小功能的结束处,goto的目的label处应是函数内另外一段小功能的开始处。
3) 不能从一段复杂的执行状态中的位置goto到另外一个位置,比如,从多重嵌套的循环判断中跳出去就是不允许的。
4)应该避免向两个方向跳转。这样最容易导致"面条代码"。
参考资料来源:百度百科-goto语句
书上示例的意思是,前面判断成立则跳转到标签所在的代码行执行,如果不成立则按顺序执行,
laststep:printf("Step 3\n");
这行代码也会执行,
laststep: 这个标签只是说明,如果goto这个标签的话就跳到这句接着往后执行 没有goto就会"无视"它
可以试试这样
#includestdio.h
int main(void)
{
int i = 1;
printf("Step 2\n");
laststep:printf("Step 3\n");
if(i--)
{
goto laststep;
}
return 0 ;
}
看看"Step 3"输出几次
标签本身没有作用域的,只是一个标志点。
但是goto本身有限制,只能是当前函数。所以,从这个角度来说,标签的作用域也可以说是当前函数。
比如
void func()
{
int a;
a=0;
loop:
a++;
if(a10) goto loop;
printf("%d",a);
}
这个程序中,loop标签就与goto配合起到了跳转作用。
对于goto来说,这个标签只要是在本函数内的就是合法的,无论是在goto前还是goto后。
但是,如下程序:
int a = 0;
void func1(void)
{
loop:
printf("%d",a);
}
void func2(void)
{
a++;
if(a10)goto loop;
}
在func2中调用goto使用了func1中的标签loop,在编译的时候就会报错。因为使用goto时只会在本函数中查找该标签。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流