预计阅读本页时间:-
早期版本BASIC和FORTRAN所依赖的goto语句在C语言中是有效的。然而,不同于那两种语言,C没有它也可以工作得相当好。Kernighan和Ritchie认为goto语句“非常容易被滥用”,并且建议“要谨慎使用,或者根本不用”。我们首先介绍怎样使用goto,然后说明为什么通常不需要使用它。
goto语句包括两个部分:goto和一个标签名称。标签的命名遵循与命名变量相同的约定,如下例所示:
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
为使上述语句工作,函数必须包含由part2标签定位的其他语句。这可以通过以标签名紧跟一个冒号来开始一条语句完成:
避免goto
原则上,C程序根本不需要使用goto语句。但是如果您有使用早期版本FORTRAN或BASIC——这两种语言都需使用goto的背景,可能会有依赖于使用goto的开发设计习惯。为帮您克服这种依赖性,我们将略述一些常见的goto情形,然后展示一个C习惯的方式。
1.处理需要多条语句的if情形:
在旧式风格的BASIC和FORTRAN中,只有直接跟在if条件后的单条语句隶属于该if。没有代码块或复合语句的规定。我们已经将这种模式转换为与C等价的模式。使用复合语句或代码块的标准C方法更易于使用:
2.二中选一:
C语言可以使用if else结构更清晰地表示这种选择:
实际上,新版本的BASIC和FORTRAN已经将else加入到新的语法中。
3.建立不确定循环:
用while循环代替:
4.跳到循环末尾并开始下一轮循环:用continue代替。
5.跳出循环:用break代替。实际上,break和continue是goto的特殊形式。使用它们的好处是它们的名字表明它们意味着什么;并且,因为它们不使用标签,所以不存在放错标签位置的潜在危险。
6.胡乱地跳转到程序的不同部分:千万不要!
但有一种goto的使用被许多C专业人员所容忍:在出现故障时从一组嵌套的循环中跳出(单条break仅仅跳出最里层的循环)。
正如从其他的例子可以看到的,可供选择的形式比goto形式更清晰。当这几种情形混合在一起时,这种差异甚至变得更明显。哪些goto协助if,哪些goto模拟if else,哪些goto控制循环,哪些只是因为您的程序已经无路可走才放在那里的?过度地使用goto,会引起程序流程的错综复杂。如果不熟悉goto,不要使用它;如果已经习惯于使用它,试着训练自己不使用。具有讽刺意味的是,C不需要goto,却有一个比大多数语言更好的goto,因为它允许您在标签中使用描述性的单词而不是数字。