C++ Primer第五章①
C++ Primer
第五章 语句
和大多数语言一样,C++提供了条件执行语句、重复执行相同代码的循环语句和用于中断当前控制流的跳转语句。本章就是要详细介绍这些语句(其实我们在之前的程序中基本都用过了,所以大家看这一章完全不费力,就跟已经学过差不多)。
简单语句
C++语言的大多数语句都以分号结尾,我前面敲的代码应该都没有漏掉分号,一个表达式末尾加上分号就成了表达式语句。
int a = 5;
a + 5;
cout << a; //输出还是5
虽然执行了加法,但是相加的结果没被使用。
空语句
就是一个分号,它的用处在于:语法上需要一条语句但是逻辑上不需要,例如:
int a = 3;
for(; a<10; ++a) //for循环的第一条语句就是空语句
{
cout << a;
}
正因为分号是一条空语句,所以我们既不能多写分号,又不能少写。
复合语句
用花括号括起来的就是复合语句,复合语句也叫块,一个块就是一个作用域,在块中引入的名字只能在块内部访问。用处在于:语法上只需要一条语句,逻辑上需要多条,例如:
while(a < 10)
{
sum += a;
++a;
}
条件语句
C++语言提供了两种按条件执行的语句:
- if语句,它根据条件决定控制流
- switch语句,它计算一个整型表达式的值,然后根据这个值从几条执行路径中选择一条
if语句
我们通过一个成绩判定的程序来了解一下:
在程序比较复杂的时候,可能会有多个if-else语句嵌套,这时候怎么看else是和那个if对应呢?C++的规定是:else与离它最近的尚未匹配的if匹配。我的建议是:写程序的时候if和else的花括号都加上,注意代码缩进对齐,就不会搞错了。const vector<string> scores = {"F", "D", "C", "B", "A", "A++"}; //把不打算改变的变量声明为const是个好习惯 string res; if(grade < 60) //低于60分的为F { res = score[0]; } else { res = scores[(grade - 50)/10]; //其他的就这么求,刚好对应 }
switch语句
为什么有了if-else还要有switch呢,我觉得是这样,switch可以让我们在若干固定选项中做出选择(当然if-else也可以,不过switch写起来更简单)。我们来写一个程序:统计五个元音字母在文本中出现的次数:
如果表达式和某个case标签的值匹配成功,程序从该标签之后的第一条语句开始执行,直到到达了switch的结尾或者是遇到break,上面代码中的break不可少,想想为什么。 break的作用是中断当前的控制流,这里break将控制权转移到switch语句外面。 我们来看看没有break会怎么样,来实现一个统计所有元音字母之和的程序:unsigned a = 0, e = 0, i = 0, o = 0, u =0; char ch; while(cin >> ch) { switch(ch) { case 'a': ++a; break; case 'e': ++e; break; case 'i': ++i; break; case 'o': ++o; break; case 'u': ++u; break; } }
unsigned cnt = 0; char ch; while(cin >> ch) { switch(ch) { case 'a': case 'e': case 'i': case 'o': case 'u': //几个case写在一起,中间没有break,因此,只要ch是其中一个,cnt都会++ ++cnt; break; } }
default标签
如果没有任何一个case标签能匹配上switch表达式的值,程序将执行紧跟在default标签后面的语句,例如:unsigned cnt = 0, other = 0; char ch; while(cin >> ch) { switch(ch) { case 'a': case 'e': case 'i': case 'o': case 'u': //几个case写在一起,中间没有break,因此,只要ch是其中一个,cnt都会++ ++cnt; break; default: ++other; break; } }