第05章 循环和关系表达式


本章内容包括:

  • for循环.
  • 表达式和语句.
  • 递增运算符和递减运算符:++和–.
  • 组合赋值运算符.
  • 复合语句(语句块).
  • 逗号运算符.
  • 关系运算符:>,>=,==,<=,<和!=.
  • while循环.
  • typedef工具.
  • do while循环.
  • 字符输入方法get().
  • 文件尾条件.
  • 嵌套循环和二维数组.

5.1 for循环

  • 程序清单5.1 forloop.cpp

5.1.1 for循环的组成部分

  • for循环的组成部分完成下面这些 步骤. 
    • 1.设置初始值.
    • 2.执行测试,看看循环是否应当继续进行.
    • 3.执行循环操作.
    • 4.更新用于测试的值.
for (initialization;test-expression;update-expression)
    body
  • 程序清单5.2 num_test.cpp 
    • 注意,循环在i变为0后结束.
  • 提示:C++常用的方式是,在for和括号之间加上一个空格,而省略函数名与括号之间的空格.这样从视觉上抢花了控制语句和函数调用之间的区别.另外,常见的做法是缩进for语句体,使它看上去比较显著.
  • 1.表达式和语句 
    • <<运算符的优先级比表达式中使用的运算符高,因此代码使用括号来获得正确的运算顺序.
    • 程序清单5.3 express.cpp
    • 注意:老式C++实现可能要求使用ios:boolalpha,而不是ios_base::boolalpha来作为cout.setf()的参数.有些老式实现甚至无法识别这两种形式.
    • 注意:C++表达式是值或值与运算符的组合,每个C++表达式都有值.
  • 2.非表达式和语句
  • 3.修改规则
for (for-init-statement condition;expression)
    statement

5.1.2 回到for循环

  • 程序清单5.4 formore.cpp
  • 提示:通常,定义一个const值来表示数组汇总的元素个数是个好办法.在声明数组和引用数组长度时(如在for循环中),可以使用const值.

5.1.3 修改步长

  • 程序清单5.5 bigstep.cpp

5.1.4 使用for循环访问字符串

  • 程序清单5.6 forstr1.cpp

5.1.5 递增运算符(++)和递减运算符(–)

  • 程序清单5.7 plus_one.cpp

5.1.6 副作用和顺序点 
5.1.7 前缀格式和后缀格式 
5.1.8 递增/递减运算符和指针

  • 注意:指针递增和递减遵循指针算术规则.因此,如果pt指向某个数组的第一个元素,++pt将修改pt,是指指向第二个元素.

5.1.9 组合赋值运算符 
5.1.10 符合语句(语句块)

  • 程序清单5.8 block.cpp

5.1.11 其他语法技巧—逗号运算符

  • 程序清单5.9 forstr2.cpp

5.1.12 关系表达式 
5.1.13 赋值,比较和可能犯的错误

  • 程序清单5.10 equal.cpp
  • 警告:不要使用=来比较两个量是否相等,而要使用==.

5.1.14 C风格字符串的比较

  • 程序清单5.11 compstr1.cpp

5.1.15 比较string类字符串

  • 程序清单5.12 compstr2.cpp

5.2 while循环

while (test-condition)
    body
  • 程序清单5.13 while.cpp

5.2.1 for与while

  • 提示:在设计循环时,请记住下面几条指导原则. 
    • 指定循环终止的条件.
    • 在首次测试之前初始化条件.
    • 在条件被在此测试之前更新条件.

5.2.2 等待一段时间:编写延迟循环

  • ANSI C和C++库中有一个函数有助于完成这样的工作.这个函数名为clock(),返回程序开始执行后所用的系统时间.
  • 程序清单5.14 waiting.cpp
// waiting.cpp -- using clock() in a time-delay loop
#include <iostream>
#include <ctime> // describes clock() function, clock_t type
int main()
{
    using namespace std;
    cout << "Enter the delay time, in seconds: ";
    float secs;
    cin >> secs;
    clock_t delay = secs * CLOCKS_PER_SEC;  // convert to clock ticks
    cout << "starting\a\n";
    clock_t start = clock();
    while (clock() - start < delay )        // wait until time elapses
        ;                                   // note the semicolon
    cout << "done \a\n";
    // cin.get();
    // cin.get();
    return 0; 
}
  • 类型别名:C++为类型建立别名的方式有两种.一种是使用预处理器(如:#define BYTE char;),第二种方法是使用C++(和C)的关键字typedef来创建别名.例如,要将byte作为char的别名,格式:typedef typeName aliasName;
  • 注意typedef不会创建性类型,而知识为已有的类型建议一个新名称.

5.3 do while循环

  • 这样的循环通常至少执行一次.
  • 程序清单5.15 dowhile.cpp

5.4 基于范围的for循环(C++11) 
5.5 循环和文本输入

  • 如何在while循环中使用这三种模式:

5.5.1 使用原始的cin进行输入

  • 程序清单5.16 textin1.cpp
  • 使用哨兵字符,将其作为停止标记.

5.5.2 使用cin.get(char)进行补救

  • 程序清单5.17 textin2.cpp

5.5.3 使用哪一个cin.get() 
5.5.4 文件尾条件

  • 如果输入来自于文件,则可以使用一种功能更强大的技术—检测文件尾EOF.
  • 程序清单5.18 textin3.cpp
  • 1.EOF结束输入
  • 2.常见的字符输入做法

5.5.5 另一个cin.get()版本

  • 注意:最初,put()成员只有一个原型—put(char).可以传递一个int参数给他,该参数将被强制转换为char.C++标准还要求只有一个原型.然而,有些C++实现都提供了3个原型:put(char),put(signed char)和put(unsigned char).在这些实现中,给put()传递一个int参数将导致错误消息,因为转换int的方式不止一种.使用显式强制类型转换的原因(如cin.put(char(ch)))可使用int参数.
  • 提示:需要知道的是,EOF不表示输入中的字符,而是指出没有字符.
  • 使用cin.get()还有一个微妙而重要的问题.由于EOF表示的不是有效字符编码,因此可能不与char类型兼容.
  • 程序清单5.19 textin4.cpp

5.6 嵌套循环和二维数组 
5.6.1 初始化二维数组 
5.6.2 使用二维数组

  • 程序清单5.20 nested.cpp

5.7 总结 
5.8 复习题 
5.9 编程练习

附件:本章源代码下载地址

猜你喜欢

转载自blog.csdn.net/weixin_39345003/article/details/82110008
今日推荐