C++ Primer Plus 学习笔记
第 5 章 循环和表达关系式
C++提供与C语言相同的for
循环、while
循环、do while
循环、if
语句和switch
语句。
for 循环
for 循环的组成部分
for
循环为执行重复的操作提供了循序渐进的步骤。
- 设置初始值。
- 执行测试,看看循环是否应当继续执行。
- 执行循环操作。
- 更新用于测试的值。
初始化、测试和更新操作构成了控制部分,由括号括起。其中每一部分都是一个表达式,彼此由分号隔开。控制部分后面的语句叫作循环体,只有测试为true
,它便被执行。
for (initialization; text-expression; update-expression)
body
C++语法将整个for
看作一条语句。
循环只执行一次初始化。
test-expression
(测试表达式)决定循环体是否被执行。通常,这个表达式是关系表达式,即对两个值的比较。C++并没有将test-expression
的值限制为只能为真或假。可以使用任意表达式,C++将把结果强制转换为bool
类型。
for
循环是入口条件循环。即每轮循环之前,都将计算测试表达式的值,当测试表达式为false
时,将不进入循环体。
update-expression
(更新表达式)在每轮循环结束时执行,此时循环体已经执行完毕。它可以是任何有效的C++表达式,还可以是其他控制表达式。
for
循环体由一条语句组成。
for
语句看上去有些像函数调用,因为它使用一个后面跟一对括号的名称。然而,for
是一个C++关键字,因此编译器不会将for
视为一个函数,这还将防止函数命名为for
。
提示:C++常用的方式是,在for
和括号之间加一个空格,而省略函数名与括号之间的空格。对于其他控制语句(如if
和while
),处理方式与for
相似。这样从视觉上强化了控制语句和函数调用之间的区别。另外,常见的做法是缩进for
语句体,使它看上去比较显著。
表达式和语句
任何值或任何有效的值和运算符的组合都是表达式。在C++中,每个表达式都有值。
C++将赋值表达式的值定义为左侧成员的值。
注意:老式C++实现可能要求使用ios::boolalpha
,而不是ios_base::boolalpha
来作为cout.setf()
的参数。有些老式实现甚至无法识别这两种形式。
通常,cout
在显示bool
值之前将它们转换为int
,但cout.setf(ios_base::boolalpha)
函数调用设置了一个标记,该标记命令cout
显示true
和false
,而不是1
和0
。
注意:C++表达式是值或值与运算符的组合,每个C++表达式都有值。
为判定表达式x = 100
,C++必须将100
赋给x
。当判定表达式的值这种操作改变了内存中数据的值时,我们说表达式有副作用。因此,判定赋值表达式会带来这样的副作用,即修改被赋值者的值。并不是所有的表达式都有副作用。例如,判定x + 15
将计算出一个新的值,但不会修改x
的值。然而,判定++x + 15
就有副作用,因为它将x
加1
。
从表达式到语句的转变很容易,只要加一个分号即可。因此下面是一个表达式:
age = 100
而下面是一条语句:
age = 100;
更准确地说,这是一条表达式语句。只要加上分号,所有的表达式都可以成为语句,但不一定有编程意义。例如,如果rodents
是个变量,则下面就一条有效的C++语句:
rodents + 6; // valid, but useless, statement
编译器允许这样的语句,但它没有完成任何有用的工作。程序仅仅是计算和,而没有使用得到的结果,然后便进入下一条语句(智能编译器甚至可能跳过这条语句)。
非表达式和语句
对任何表达式加上分号都可以成为语句,但这句话反过来说就不对了。也就是说,从语句中删除分号,并不一定能将它转换为表达式。就目前使用的语句而言,返回语句、声明语句和<