首页 > 代码库 > 第五章 循环和关系表达式

第五章 循环和关系表达式

第五章  循环和关系表达式

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]; 将建立一个5大小的矩阵。二维数组在内容是一块连续的空间,是多个一维数组连续存放。

    二维数组的初始化:

    int matrix[2][2] = { { 1, 2 }, { 2, 2 } };    //初始化列表

  

第五章 循环和关系表达式