现代C:概念剖析和编程实践
上QQ阅读APP看书,第一时间看更新

3.3 多重选择

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

042-01

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

042-02

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

从语法上讲,switch非常简单:

043-01

其语义简单易懂:casedefault标签作为跳转目标C。根据表达式的值,控制在标签对应的语句处继续。如果碰到break语句,它后面的所有switch都会终止,控制转移到switch之后的下一条语句。

根据此规范,同if-else循环结构相比,switch语句使用更广泛:

043-02

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

043-03

switch结构比if-else更灵活,但它在另一方面受到限制:

要点3.5 case值必须是整型常量表达式。

在5.6.2节中,我们将详细了解这些表达式。现在,只要知道这些值必须是我们直接在源代码中提供的固定值就足够了,比如前面示例中的43210。特别是,像count这样的变量只允许在switch部分使用,而不允许在各个case中使用。

switch语句的良好灵活性也带来了代价:它更容易出错。特别是,我们可能会不小心跳过变量定义:

要点3.6 case标签不能超出变量定义的作用域。

挑战2 数值导数

我们会经常用到数值算法的概念。亲自动手,看看你能否实现函数double F(double x)的数值导数double f(double x)

F作为你在本练习中使用的函数来实现此操作。之所以选择F是因为它是一个已知导数的函数,比如sincos,或者sqrt。这允许你检查结果的正确性。

挑战3 π

计算π的N个小数位。

总结
  • 数值可以直接用作if语句的条件,0表示“false”,所有其他值都为“true”。
  • 有三种不同的循环语句:fordowhilefor是用于域循环的首选工具。
  • switch语句执行多重选择。如果没有通过break来终止,执行完一个case就会进入下一个case

[练习6]在程序中测试所示的switch语句。看看如果去掉一些break语句会发生什么。