C语言拾遗-C语言关键字-goto

摘要:C 语言中的 goto 语句允许程序把控制无条件转移到同一函数内的被标记的语句。

goto

 goto语句又称为无条件转移语句,使用goto语句可以使CPU直接跳转到其label标注处执行程序。但是在多数的高级编程语言课程上都不提倡使用goto语句,原因是goto语句过于灵活,过度的使用可能会导致结构化设计程序的逻辑混乱以及降低代码可读性。但另一方面,常常会看到很多优秀的编程人员在使用goto语句,而且大名鼎鼎的Linux内核中有大量的goto语句,并且Linus本人也推荐合理的使用goto语句。注意,这里说的是合理的使用goto会大大简化代码,并且使程序逻辑更加清晰。

1 基本语法

goto label;
..
.
label: statement;

其中,label为我们自己定义的一个标签,定义的规则与变量的命名相同,它的位置是不固定的,它可以写在goto语句的后面,也可以写在它的前面,然而goto语句只能在一个函数内部跳转,它并不允许跳转出一个函数外部。

示例1

我们可以通过goto语句来实现一个类while语句的循环功能:

int day = 1;
loop: 
if (day <= 31)
{
    printf("%d\n", day);
    day++;
    goto loop;
}

上面程序就是利用了goto和if语句来实现了循环功能,它与while实现的循环功能一样,其中loop为我们定义的一个label(标签)。

示例2

接下来我们再来看一个关于goto语句合理使用的例子,在看这个例子之前我们先来看看一个在双循环中根据条件跳出的普通实现

int found = 0;
for (int i = 0; i < n && !found; i++)
{
    for (j = 0; j < m && !found; j++)
    {
        if (a[i] == b[j])
        {
            found = 1;
        }
    }
}
if (found)
{
    //do something
}

由于break;语句只能跳出当前循环,不能跳出多层嵌套循环之外,所以我们只能用found变量来做为循环嵌套中的结束条件。

现在我们可以使用goto来完成这个功能:

for (int i = 0; i < n; i++)
{
    for (j = 0; j < m; j++)
    {
        if (a[i] == b[j])
        {
            goto found;
        }
    }
}
found: // do something

可以看到使用了goto语句的程序明显比使用双循环通过条件跳出的简洁了。

补充总结:

  • 合理地使用goto可以使程序更简洁,不合理地使用goto会破坏程序的结构,使程序逻辑混乱以及可读性降低。
  • goto可以用来跳出多重循环
  • goto语句只能在一个函数内部跳转,它并不允许跳转出一个函数外部。标签的位置是不固定的,可以写在goto语句的后面,也可以写在它的前面。

参考链接

https://blog.csdn.net/walle2018/article/details/79607060
https://www.askpure.com/course_TGESH6E1-XRQR2I14-9XPX7Q53-KDBES2UV.html
https://www.runoob.com/cprogramming/c-goto-statement.html
http://c.biancheng.net/view/266.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值