在本节中我们来学习一个比较有争议的语句goto,goto语句可以使程序在没有任何条件的情况下跳转到指定的位置,所以goto语句又被称为是无条件跳转语句。它的语法如下

goto label;

//其它代码

label:

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

        当然,很多书籍上在提及goto语句时都会提醒读者并不推荐使用它。但我们还是推荐读者可以合理的使用goto语句。

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

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



 

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

        接下来我们再来看一个关于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语句可以在程序中任意的跳转到指定的标签位置,所以如果用的不好可能会破坏程序的逻辑性和安全性。