
3.3 多重选择
C所提供的最后一个控制语句是switch
语句,它是另外一种选择C语句,主要用于if-else
结构的级联过于烦琐的情况:

在本例中,我们有一个比false-true
更复杂的选择,它可以有多种结果。我们可以将其简化如下:

这里,我们根据arg
变量的值选择一个puts
调用。与printf
一样,puts
函数也是由stdio.h
提供的。它输出一行字符串,该字符串是传递给它的参数。我们为字符'm'、'r'
、'j'
和'c'
提供了它们各自的情况(case),备用C的情况标记为default
。如果arg
不匹配任何case
值,则触发default case[练习6]。
从语法上讲,switch
非常简单:

其语义简单易懂:case
和default
标签作为跳转目标C。根据表达式的值,控制在标签对应的语句处继续。如果碰到break
语句,它后面的所有switch
都会终止,控制转移到switch
之后的下一条语句。
根据此规范,同if-else
循环结构相比,switch
语句使用更广泛:

一旦跳到块中,执行就会继续,直到遇到break
或块结束。在本例中,由于没有break
语句,后面所有的puts
语句都会运行。例如,当count
值为3
时,输出结果为一个三行的三角形:

switch
结构比if-else
更灵活,但它在另一方面受到限制:
要点3.5 case
值必须是整型常量表达式。
在5.6.2节中,我们将详细了解这些表达式。现在,只要知道这些值必须是我们直接在源代码中提供的固定值就足够了,比如前面示例中的4
、3
、2
、1
、0
。特别是,像count
这样的变量只允许在switch
部分使用,而不允许在各个case
中使用。
switch
语句的良好灵活性也带来了代价:它更容易出错。特别是,我们可能会不小心跳过变量定义:
要点3.6 case
标签不能超出变量定义的作用域。
挑战2 数值导数
我们会经常用到数值算法的概念。亲自动手,看看你能否实现函数double
F(
double
x)
的数值导数double
f(
double
x)
。
用F
作为你在本练习中使用的函数来实现此操作。之所以选择F
是因为它是一个已知导数的函数,比如sin
,cos
,或者sqrt
。这允许你检查结果的正确性。
挑战3 π
计算π的N个小数位。
总结
- 数值可以直接用作
if
语句的条件,0表示“false”,所有其他值都为“true”。 - 有三种不同的循环语句:
for
、do
和while
。for
是用于域循环的首选工具。 switch
语句执行多重选择。如果没有通过break
来终止,执行完一个case
就会进入下一个case
。
[练习6]在程序中测试所示的switch
语句。看看如果去掉一些break
语句会发生什么。