设计智能程序的一个关键是使程序具有决策能力。上一章介绍了一种决策方式——循环,在循环中程序决定是否继续循环。本章我们来研究一下如何使用分支语句在可选择的操作中做出决定
if语句
当C++ 程序必须决定是否执行某个操作时,通常使用if语句来实现选择。if有两种格式:if和if else
if(test-condition)
statement
如果(test-condition)为true,则程序执行statement,后者既可以是一条语句也可以是一个语句块;如果(test-condition)为false,则程序将跳过该语句。
通常情况下,测试条件都是关系表达式,例如那些用来控制循环的表达式
假设希望计算输入字符中的空格总数和总字符数(用英文句号来确定句子的结尾)
#include<iostream>
using namespace std;
int main()
{
char ch;
int space = 0;
int total = 0;
cin.get(ch);
while (ch != '.')
{
if (ch == ' ')
++space;
++total;
cin.get(ch);
}
cout << space << " spaces, " << total << " characters total in setence" << endl;
return 0;
}
if else语句
上面提到的if语句让程序决定是否执行特定的语句或语句块,而if else语句则让程序决定执行两条语句或语句块中的哪一条(类似于你选择中午吃米饭还是面条)
if(test-condition)
statement1
else
statement2
如果测试条件为true或非零,则程序将执行statement1,跳过statement2;相反如果测试条件为false或0,则程序将跳过statement1,执行statement2。每条语句都可以是一条语句,也可以是大括号括起来的语句块。
if else if else结构
和我们的现实生活一样,计算机程序也可能提供两个以上的选择,遂可以将if else语句进行扩展,也就是嵌套if else语句,在一个if else 语句里面再加入一个if else语句
逻辑表达式
- 逻辑OR运算符:||
- 逻辑AND运算符:&&
- 逻辑NOT运算符:!
逻辑OR
当两个条件中有一个或全部满足某个要求时,可以用or来说明这种情况。
C++会采用逻辑OR运算符(||)将两个表达式组合在一起。如果原来表达式中的任何一个或全部都为true(或非0),则得到表达式的值为true,否则为false。
同时C++还规定,||运算符是个 sequence point。也就是先判定左侧的值,再对右侧的值进行判定
逻辑AND
将两个表达式组合在一起。仅当两个表达式的值都为true时,得到的表达式的值才能为true
逻辑NOT
!运算符将它后面的表达式的真值取反。也就是说,如果expression为true,则!expression为false,反之亦然。
字符函数库
C++ 从C语言继承了一个与字符相关的非常方便的函数包。它可以简化一些工作——确定字符串是否是大写字母、数字、标点符号等工作,这些函数的原型是在cctype种定义的。
?:运算符
C++有一个常被用来代替if else语句的运算符——就是我们将要学习的(?:),它是C++中唯一一个需要3个操作数的运算符,通用格式如下:
expression1 ? expression2 : expression3
如果expression1为true,则整个表达式的值为expression2的值;否则,整个表达式的值为expression3的值
x = 5 > 3 ? 10 : 12 //因为5>3为true,故x的值为10
y = 3==9 ? 25 :18 //因为3==9为false,故y的值为18
与if else 语句相比,条件运算符更简洁
switch语句
假设程序要选择的条件选项很多,可以通过嵌套if else 语句来处理,但是C++的switch语句能够更容易地从大型列表中进行选择。下面是switch语句的通用格式:
switch(integer-expression)
{
case lable1: statement(s)
case lable2: statement(s)
...
default:statement(s)
}
C++的switch语句就像指路牌,告诉计算机应执行哪行代码。执行到switch语句时,程序将跳到使用integer-expression的值标记的那一行 。
integer-expression必须是一个结果为整数的表达式。另外每个标签都必须是整型常量表达式。最常见的标签是int 或char 常量。如果integer-expression不与任何标签匹配,则程序将跳到标签为default的那一行。(default标签是可选的,如果省略没写,而又没有匹配的标签,则程序将跳到switch后面的语句处执行)
这里需要注意的是:
C++中的case标签只是行标签,而不是选项之间的界线。也就是说,程序跳到switch中特定代码行后,将依次执行之后的所有语句,除非有明确的其他指示。程序不会在执行到下一个case处自动停止,要让程序执行完一组特定语句后停止,必须使用break语句。
#include<iostream>
using namespace std;
void showmenu()
{
cout << "Please enter 1,2,3,4 or 5:\n"
"1)alarm 2)report\n"
"3)abili 4)comfort\n"
"5)quit\n";
}
void report()
{
cout << "It's been an excellent week for business.\n"
"Sales are up 120%.Expenses are down 35%.\n";
}
void comfort()
{
cout << "Your employees think you are the finest CEO\n"
"in the industry.";
}
int main()
{
showmenu();
int choice;
cin >> choice;
while (choice != 5)
{
switch (choice)
{
case 1:cout << "\a\n";
break;
case 2:report();
break;
case 3:cout << "The boss was in all day.\n";
break;
case 4:comfort();
break;
default:cout << "That's not a choice.\n";
}
showmenu();
cin >> choice;
}
cout << "Bye!\n";
return 0;
}
break和continue语句
break和continue语句都能使程序跳过部分代码。可以在switch语句或任何循环中使用break语句,使程序跳到switch或循环后面的语句处执行。continue语句用于循环中,让程序跳过循环体中余下的代码,并开始新一轮循环(个人理解是,break直接跳出整个循环语句,continue是跳出单次循环,但要继续执行下轮循环)