![Visual C++从入门到精通(第5版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/338/27563338/b_27563338.jpg)
3.3 分支语句
C++语言中提供了两种分支语句,即if语句和switch语句。其中,if语句多用于单分支条件判断,switch语句用于多分支条件判断。本节将详细介绍这两种分支语句。
3.3.1 if语句
if语句通常用于单分支条件判断。其简单的语法格式如下:
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P94_29317.jpg?sign=1739366119-EWYQ3oE38XN6Ogwz3sfIeY45NJQ44NE8-0-8bf890183d0817b7ed8122a86377069d)
其中,else部分的语句是可选的。if语句的执行过程为:首先判断表达式的真假,如果为真,则执行语句1,否则执行else部分的语句(如果存在else语句)。例如,下面的if语句均是合法的。
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P94_29327.jpg?sign=1739366119-dwy3ynqy3AXwO0jpszuoZKu4Uu3tExHH-0-c80f77e3661d42466b4bc6ba9a376107)
注意
在if语句的表达式中,有时在使用“==”运算符时,程序员很容易将“==”运算符写成“=”运算符,由于这两个运算符都是合法的,因此编译器无法检测到这样的错误。在编程时一定要谨慎使用“==”运算符,否则将给您带来无尽的烦恼。
使用上述的if语句只能进行简单的逻辑条件判断。考虑如下的一种情况:学生成绩大于60的为及格、大于80的为良、大于90的为优秀,如何在程序中判断学生成绩呢?分析如下代码。
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P94_29357.jpg?sign=1739366119-ioagYSDlhuHApdwMd22EbUxJVCk3NbHB-0-9eb3959ef83100d59ccfce49c1a5c29c)
在上面的代码中存在多个缺点:(1)代码执行效率较低,因为程序会逐一执行每一个if语句,例如,如果ivar的值为59。当程序执行完“if(ivar < 60)”语句后,还需要执行“if (ivar >= 60 && ivar< 80)”“if (ivar >= 80 && ivar < 90)”等if语句。(2)判断条件比较复杂,上述代码中使用了多个区域判断。图3.1描述了上述代码的执行情况。
在C++中,if语句除了提供else子句外,还提供了else if子句。使用else if子句时,if语句的执行过程为:首先判断if条件表达式的真假,如果为真,则执行if部分的语句,然后整个if语句结束。如果为假,则继续判断else if语句中表达式的真假;如果为真,则执行else if部分的语句,if语句结束,否则继续向下判断。下面的代码使用else if子句对之前的学生成绩判断代码做了修改。
【例3.3】 成绩等级判断。
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P95_29458.jpg?sign=1739366119-KaPkxZGtrBTa8LWqAzzSpjqUa8AK11FI-0-e8312acc87b5a86396f4ab5b55ff9573)
从上述代码可以看出,通过使用else if语句,不但提高了代码执行效率,还简化了区域判断的条件,使代码更加简洁。图3.2描述了上述代码的执行情况。
为了描述复杂的逻辑条件,if语句还允许嵌套,即if语句中包含if语句。例如,下面的代码利用嵌套的if语句来进一步判断成绩是否进行了确认。
【例3.4】 嵌套的if语句。
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P95_29503.jpg?sign=1739366119-c9V1YLXEl1olZafLZg7IjznMArI1xiQg-0-c12c1246567b07788dc0343838245376)
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P96_95175.jpg?sign=1739366119-DyQrRePlyQGnNhyw7FTQpjGNdHSbFwvh-0-69ca461d7811e32c313582567c7cbb7d)
图3.1 if语句流程图1
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P96_95176.jpg?sign=1739366119-rKqvRdH9mNtm7I4LibBdcGEXCqDtCNKk-0-fc2d007daecbf4f0d5b1c4f7c02314c5)
图3.2 if语句流程图2
对于上述代码,还可以修改为如下形式。但是,用户在开发程序时,建议使用上述代码格式。
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P96_29584.jpg?sign=1739366119-Pu62iJKboY405ngON8IAlPJEKHdTGUei-0-a5ff88407b8b81d23f4662f6003e87e1)
在上面的代码中注意else子句,这里else子句是与“if (checked)”语句对应的,即采用就近原则,else子句与其之前最近的if语句对应,尽管没有使用复合语句分隔。
3.3.2 switch语句
switch语句用于多分支条件判断,它能够测试一组有序类型(整型、字符型和枚举型等)的数据。当发现匹配的常量时,它将执行与该常量关联的语句。
switch语句的语法格式如下:
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P96_29619.jpg?sign=1739366119-upg9KN4eD5sYXFcOn9KEQ4CyrNRykZav-0-2ccdb093885eb58d135a1c1a972e116b)
其中,表达式必须是有序类型,不能是实数或字符串类型。表达式逐一与case语句部分的常量匹配,如果发现有常量与表达式相匹配,则执行当前case部分的语句,直到遇到break语句位置,或者到达switch语句的末尾(没有遇到break语句)。当表达式没有发现与之匹配的常量,将执行default部分的代码。default语句是可选的,如果代码中没有提供default语句,并且没有常量与表达式匹配,switch语句将不执行任何动作。下面的代码利用switch语句判断数据库的当前状态。
【例3.5】 使用switch语句判断数据库的状态。(实例位置:资源包\TM\sl\3\1)
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P97_29737.jpg?sign=1739366119-URhOqGP2TY4Yqj4QvLcLteERrZVr74kx-0-68451b324dc14fd5bde5de4a1c47884d)
执行上述代码,结果如图3.3所示。
在switch语句中,如果需要对各个常量进行相同的处理,则可以将多个case语句组织在一起,使用一个执行语句。
【例3.6】 在switch语句中对多个常量进行相同的处理。(实例位置:资源包\TM\sl\3\2)
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P97_29857.jpg?sign=1739366119-PHczer3Q9s0hXi0TSouot0D0UGoWOrnp-0-38064e44de6edc21a55407eb7e464ead)
switch语句中的break语句属于跳转语句,也可以用于循环语句中。在switch语句中,当遇到break语句时,程序将跳转到switch语句之后的下一行代码处。如果在switch语句中没有使用break语句,当表达式与某个常量匹配时,将执行当前case语句代码,并且继续向下执行case语句的代码,直到遇到break语句或者switch语句结束。观察如下代码:
【例3.7】 switch语句的执行顺序。(实例位置:资源包\TM\sl\3\3)
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P98_29956.jpg?sign=1739366119-yQHKxSu6hZJrDN3UGQz83VyRqjGWWEXy-0-abcb334f6734dc98490543d391784268)
执行上述代码,结果如图3.4所示。
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P98_30032.jpg?sign=1739366119-TDWDb7rRMqGMt16eL45VvdFPrSF9tokS-0-095092dcb6f93e42b7033612d5172aff)
图3.3 switch语句1
![](https://epubservercos.yuewen.com/771DC2/15825992505222206/epubprivate/OEBPS/Images/Figure-P98_30031.jpg?sign=1739366119-7qfrKCQUZsX9ZKe9K9fUQvgU8qepphlP-0-3c6a81d9ceb7e9d3a6e2a3a8d7e5a1ca)
图3.4 switch语句2
由于在switch语句中没有使用break语句,当表达式dbste与close常量匹配时,没有遇到break语句,并且switch语句没有结束,因此继续向下执行,执行了其后的所有switch语句。
注意
在开发程序时,这通常不是预期的结果,因此在编写switch语句时,除非程序需要,否则不要遗忘break语句。