首页 > 代码库 > 第五章 循环和关系表达式
第五章 循环和关系表达式
第五章 循环和关系表达式
5.1 for循环
5.1.1 for循环的使用
For循环的组成部分完成下面4个步骤:
1) 设置初始值;
2) 执行测试,看看循环是否应当继续运行;
3) 执行循环体;
4) 更新用于测试的值。
For循环的形式如下:
for (init-expresstion; test-expresstion; update-expresstion) body-statement
说明:
1) C++将整个for看做一条语句,虽然循环体可以包含一条或多条语句。
2) For循环只执行一次初始化表达式,初始化表达式可以空,空时最好写入NULL,或者0,这样可以代表并不是程序员忘记了写初始化语句。
3) Test-expression可以用任意类型表达式,C++将把结果强制转化为bool类型,其中0值代表false,非0值代表true。通样test-expression可以空,空的时候等价于true,空的时候最好写入true,或者1,这样代表并不是程序员忘记了写初始化语句。
4) For循环是入口条件(entry-condition)循环,在每轮循环之前计算测试表达式的值。Update-expression在每轮循环结束时执行。同样Update-expression可以空,空时最好写入NULL,或者0,这样可以代表并不是程序员忘记了写初始化语句。
5) C++常用的方式是在for与圆括号之间加上一个空格,while与if类似。而函数与圆括号之间不要空格。
5.1.2 带变量声明的for循环
C++在C的基础上为for加入一个特性,可以在for的init-expresstion中声明变量。这时for循环的形式可以表述为:
for (init-statement test - expresstion; update - expresstion) body - statement
5.1.3 副作用与顺序点
副作用(side effect)是指计算表达式时对某些变量进行了修改。顺序点(sequence point),可以认为一个分号就是一个顺序点。顺序点意味着处理下一条语句之前,赋值运算符、递增运算符、递减运算符进行的所有修改都必须完成。任何完整的表达式末尾都是顺序点。
完整表达式是指:不是另一个更大的表达式的子表达式。
例如:
y = (4 + x++) + (6 + x++);
4 + x++不是一个完整的表达式,C++不保证x值在4+x++后加1。而这条语句是一个完整的表达式,C++只保证在下一条语句之前,x被递增2次。
5.1.4 前缀格式与后缀格式
前缀格式如++x与后缀格式x++。如果表达式的值未被使用,则只存在副作用。值用前缀格式还是后缀格式对程序行为没有什么影响。但执行速度有细微差别。
对于前缀格式,将变量值加1,然后返回结果。
对于后缀格式,先复制一个变量的副本,然后将变量加1,然后返回复制的副本。
对于内置类型和现代编译器,这看似不是问题,然而对于类而言,前缀格式比后缀格式效率更高。因此,应当养成好习惯,尽量使用前缀格式。
5.1.5 递增/递减运算符和指针
将*和++同时用于指针时,运算符的优先级和结核性将决定计算结果。
前缀递增、前缀递减与解除引用运算符的优先级相同,都是以从右到左结合。
后缀递增、后缀递减优先级相同,但是比前缀递增优先级高,以从左到右结合。例如下面的一些表达式:
*++pt; //先把++作用于pt, 然后将*作用于被递增后的pt; (*pt)++; //先将*作用于pt,然后把取出的值递增; *pt++; //先把++作用于pt,后将*作用于被递增的pt;
5.1.6 复合语句(语句块)
C++和C使用两个花括号{}构造一个复合语句(语句块)。代码被一堆花括号包含组成将被视为一条语句。
5.1.7 逗号运算符
逗号运算符允许将两个表达式语句(必须是表达式语句,声明语句不行)放到C++语句只允许一个表达式的地方。一个逗号是一个顺序点。被逗号分隔的表达式将按照从左到右的顺序执行。如—j,++i;
逗号并不都是逗号运算符。在声明语句中,逗号的作用是将变量列表中相邻的变量名分隔开。如int i, j;
逗号运算符多用于for的init-expression和update-expression。这样带来了很多灵活性。
5.1.8 比较运算符
C++的比较运算符如下
操作符 | 含义 |
< | 小于 |
<= | 小于或等于 |
== | 等于 |
> | 大于 |
>= | 大于或等于 |
!= | 不等于 |
说明:C风格的字符串比较,应该使用函数strcmp(),这个函数在头文件《cstring》中。C++风格的字符串string类可以使用比较运算符。
5.2 while循环
While循环可以看做是没有初始化和更新部分的for循环。While循环也是入口条件循环。只有测试条件和循环体,形式如下:
while (test-condition) body-statement
首先,计算test-condition,如果为true执行循环体中的语句。
其次,返回再执行测试条件。
在C++中,for循环和while循环本质上是相同的。如
for (init-expresstion; test-expresstion; update-expresstion) body-statement
可以转换为
init-expresstion; while (test-condition){ body-statement update-expresstion; }
5.3 do-while循环
Do-while循环是出口条件(exit condition)循环。形式如下:
do body-statement while (test-condition);
Do-while循环,先执行循环体,在执行测试条件。 注意while后面的圆括号后面要加分号。
通常,入口条件循环比出口条件循环好。也有例外,do-while循环多用于获取用户输入。
5.4 基于范围的for循环(C++11)
基于范围的for循环简化了常用的循环,对数组(或容器类,如vector、array)。看下面的例子:
//对数组使用基于范围的for循环 double v[4] = { 1.0, 2.0 }; for (double d : v) { cout << v << endl; }
如果想修改数组内容,需要使用引用,引用将在后面讲解,这里看下例子:
//使用引用修改数组内容 double v[4] = { 1.0, 2.0 }; for (double &d : v) { d *= 0.8; }
这里的数组也可以是初始化列表:
//使用初始化列表 for (double d : {1.0, 2.0, 3.0}) { cout << d << endl; }
5.5 二维数组
C++没有提供二维数组,但是用户可以创建每个元素本身都是数组的数组。如int matrix[4][5]; 将建立一个4×5大小的矩阵。二维数组在内容是一块连续的空间,是多个一维数组连续存放。
二维数组的初始化:
int matrix[2][2] = { { 1, 2 }, { 2, 2 } }; //初始化列表
第五章 循环和关系表达式