用break语句退出循环……
但如果想在循环中的某个地方跳出循环呢?当然,可以重新调整代码的结构,但更简单的方法是,使用break
语句直接跳出循环:
break
语句可以用 来退出循环语句和switch
语句。使用
break
时看清你在哪里,并不是所有地方都能够使用break
。
break
语句可以直接退出当前循环,跳过循环体中break
之后的所有语句。break
非常有用,因为它有时是结束循环最简单有效的方法,但应该避免滥用break
,因为它们会降低代码的可读性。
……用continue
继续循环
如果想跳过循环体的其余部分,然后回到循环的开始,那么continue语句就是你的最佳伴侣:
古墓谜案
break不能从if语句中退出。
1990年1月15日,AT&T的长途电话系统死机,造成6万人无法使用电话服务。起因是一个负责写电路交换部分C代码的开发人员企图用
break
从if
语句中退出,但break
不能从if
语句中退出。相反,程序跳过了整段代码,引起了这个bug,令7千万次电话呼叫在9个多小时内无法接通……
函数聚焦
在试验新学的循环“咒语”前,我们绕道去看一眼函数。
到目前为止,在你写过的每个程序中,都必须创建一个函数——
main()
函数:
在C语言中几乎所有函数都有着相同的格式。例如在下面这个程序中,
main()
函数调用了一个自定义函数。
larger()
函数与main()
函数有一点区别,它接收参数(argument或parameter)。参数是一个局部变量,函数从调用它的代码那里得到参数的值。larger()
函数要接收两个参数:a
和b
,它返回两个参数中较大那个的值。
C标准礼貌指南
main()
这一函数的返回类型是int
,因此必须在函数结束前包含一条return
语句。即使不加,代码也能编译通过,但会收到编译器的警告。支持C99标准的编译器会在你忘记的时候插入一条return
语句。如果你想让编译器遵循C99标准,可以使用-std=99
选项。
void函数聚焦
在C语言中,大部分函数都有一个返回值。但有时候,想要创建的函数中并没有有用的信息需要返回。它更多只是做了一些事,而不是计算出一个结果。通常情况下,函数都需要包含一条
return
语句,但只要把函数的返回类型声明为void
,没有return
语句也无妨。
在C语言中,关键字
void
意味着无所谓,一旦告诉C编译器你不关心函数的返回值,函数就不需要有return
语句。
这里没有蠢问题
问:如果我创建了一个
void
函数,是否就意味它一定不能有return
语句?答:你还是可以包含
return
语句,但编译器很可能会产生一条警告消息。而且在void
函数中包含return
语句没有任何意义。11 在
void
函数中的return
语句有时可以用来提前退出函数。——译者注问:真的吗?为什么没有意义?
答:因为如果你试图读取
void
函数的值,编译器会报错。
链式赋值
在 C 语言中,几乎每样东西都有返回值,不仅仅是函数调用,就连赋值表达式也有返回值。例如下面这条语句:
- x = 4;
它把数字 4 赋值给变量。有趣的是表达式“
x = 4
”本身也有一个值,这个值是4,即赋给 x 的值。为什么说这个东西很有用呢?因为你可以用它来做一些很酷的事情,比如把多条赋值语句链在一起写:
这行代码同时将
x
和y
的值设为了 4 。事实上,可以去掉括号,缩短代码的长度:
- y = x = 4;
你经常会在需要给多个变量赋相同值的代码中看到链式赋值。
弄乱的消息
下面列出了一个C语言的小程序。程序少了一块代码,你的任务是将候选代码块(左)和它对应的输出结果进行配对。有的输出结果可能一次都用不到,有的可能用到好几次。用直线把候选代码块和它所对应的命令行输出连接起来。
练习
既然你已经知道了怎么创建
while
循环,请修改程序让它在游戏期间保持计数。每发一张牌就显示一次计数,如果玩家输入X就终止程序,如果玩家输入了错误的值(如11或24)就显示错误消息。
弄乱的消息解答
下面列出了一个C语言的小程序。程序少了一块代码,你的任务是将候选代码块(左)和它对应的输出结果进行配对。有的输出结果可能一次都用不到,有的可能用到好几次。请用直线把候选代码块和它所对应的命令行输出连接起来。
练习解答
既然你已经知道了怎么创建
while
循环,请修改程序让它在游戏期间保持计数。每发一张牌就显示一次计数,如果玩家输入X就终止程序,如果玩家输入了错误的值(如11或24)就显示错误消息。
试驾
既然算牌程序已经完成了,是时候带它出去兜兜风了,您意下如何?觉得它能工作吗?
算牌程序工作了!
你已经完成了第一个C程序。借助C语言的语句、循环、条件的威力,你已经创造了一个具有完整功能的算牌器。
干得好!
免责声明:用计算机算牌在很多州是犯法的,赌场那群家伙可不是好惹的。所以千万别那么做,好吗?
这里没有蠢问题
问:C语言为什么需要编译?其他一些语言就不需要编译,比如JavaScript,是吗?
答:为了让代码执行起来更快,C语言需要编译。尽管有些语言不是编译型语言,但它们中的一些,像JavaScript和Python,为了提高速度通常会在幕后使用一些编译技术。
问:C++是另一个版本的C语言吗?
答:不是,虽然C++的设计初衷是为了扩展C,但现在看来远不止如此,人们最初创造C++和Objective-C都是为了用C语言写面向对象的程序。
问:什么是面向对象?我们在本书中会学吗?
答:面向对象是一种对抗软件复杂性的技术,我们在本书中不会做专门研究。
问:C语言为什么看起来很像JavaScript、Java和C#等语言?
答:C语言的语法非常简洁,因此影响了很多其他语言。
问:gcc这三个字母分别代表什么含义?
答:GNU编译器套装(GNU Compiler Collection)。
问:为什么是“套装”?难道不止C语言一种吗?
答:GNU编译器套装可以用来编译很多语言,而C语言可能是人们在应用gcc时使用最多的语言。
问:我能创建一个永无止尽的循环吗?
答:可以,如果循环条件的值是1,循环就会永无止尽地运行下去。
问:创建一个永无止尽的循环是个好主意吗?
答:有时候是,通常在一些诸如网络服务器的程序中会使用无限循环(一个永无止尽的循环),程序会反复地做一件事直到有人停止它。但大部分的程序员使用循环是为了让它们在某个时刻停止。
要点
只要条件为真,
while
循环就会运行代码。
do-while
循环和while
循环十分类似,不过至少执行一次代码。某些循环用
for
来写更简洁。可以用
break
在任意时刻退出循环。可以用
continue
随时跳到循环条件处。
return
语句会从函数返回一个值。
void
函数不需要return
语句。在C语言中,所有表达式都有值。
赋值表达式有一个值,因此可以把它们链在一起写(
x = y = 0
)。