C++PrimerPlus6-05-循环和关系表达式

第5章 循环和关系表达式

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

5.1 for循环

5.1.1 for循环的组成部分

5.1.2 回到for循环

5.1.3 修改步长

5.1.4 使用for循环访问字符串

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

5.1.6 副作用和顺序点

5.1.7 前缀格式和后缀格式

对于类而言,前缀版本的效率必后缀版本高(用户定义)。

5.1.8 递增/递减运算符和指针

5.1.9 组合赋值运算符

5.1.10 复合语句(语句块)

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

逗号运算符,允许将两个表达式放在C++句法只允许放一个表达式的地方。
逗号是一个顺序点,所有运算符中逗号运算符的优先级是最低的。

5.1.12 关系表达式

5.1.13 赋值、比较和可能犯的错误

5.1.14 C风格字符串比较

C风格字符串,不能简单的使用==进行比较。因为数组名是地址,用引号括起来的字符串常量也是地址,==是意义是看他们是否存储再相同的地址上。
应该使用**strcmp()**,如果两个字符串相同,函数返回0。

word == "mate" // C风格字符串不可以这么比较
sttrcmp(word, "mate"); // 这么比较

5.1.15 比较string类字符串

使用关系运算符进行比较。

5.2 while循环

5.2.1 for与while

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

clock()返回程序开始执行后所用的系统时间。头文件ctime定义了CLOCKS_PER_SEC,将系统时间除以此值,可以得到秒数。或者将秒数乘以CLOCKS_PER_SEC,得到以系统时间单位为单位的时间。

#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";

    return 0;
}

clock_t类型是clock()返回类型的别名,建立别名的两种方式:

  1. #define BYTE char
  2. typedef typeName aliasName;

5.3 do while循环

先执行循环体,至少执行一次。出口条件(exit condition)循环。

do
    body
while (test-expression)

5.4 基于范围的for循环(C++11)

for (double &x : prices) {}

5.5 循环和文本输入

逐字符读取来自文件或键盘的文本

5.5.1 使用原始的cin进行输入

while (ch != '#')
{
  cout << ch;
  ++count;
  cin >> ch;
}

缺点:1)cin会忽略空格和换行符。2)cin的输入被缓冲,按下回车后才会发送给程序。

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

使用cin.get(char)读取输入中下一个字符(空格也可以),替换cin>>ch

while (ch != '#')
{
  cout << ch;
  ++count;
  cin.get(ch);
}

能回显每个字符包括空格,但输入仍被缓冲。

5.5.3 使用哪一个cin.get()

目前介绍了三种cin.get():

  • cin.get(name, ArSize)
  • cin.get(ch):本次用到的
  • cin.get()

5.5.4 文件尾条件

检测文件尾(EOF)。很多PC编程环境都将Ctrl+Z视为模拟的EOF。

检测到EOF后,cin将eofbit和failbit都设置为1,可以通过eof()来查看eofbit是否被设置(后者是fail()函数)。他们是事后报告,所以应将cin.eof()或cin.fail()放在读取后。

while (cin.fail() == false)
{
  ...
}
while (cin.get(ch)); // 可以简化为这样

5.5.5 另一个cin.get()版本

旧C中,用cin.get()代替cin.get(char),用cout.put()代替cout,用EOF测试代替cin.fail()。

int ch; /// for compatibility with EOF value
ch = cin.get();
while (ch != EOF)
{
  cout.put(ch); // cout.put(char(ch)) for som implementations
  ++count;
  ch = cin.get()
}

cin.get(ch)与cin.get()
属性|cin.get(ch)|ch=cin.get()
-|-|-
传递输入字符的方式|赋给参数ch|将函数返回值赋给ch
用于字符输入时函数的返回值|istream对象(执行bool转换后为true)|int类型的字符编码
到达EOF时函数的返回值|istream对象(执行bool转换后为false)|EOF

5.6 嵌套循环和二维数组

每个元素本身是数组的数组,下面表示一个包含4个元素的数组,每个元素都是由5个int组成的数组:

int maxtemps[4][5];

5.6.1 初始化二维数组

花括号里花括号。

5.6.2 使用二维数组

5.7 总结

  • for, while, do while
  • <, >, ==, !=
  • cin >> ch, cin.get(ch), ch = cin.get(), EOF

5.8 复习题

5.9 编程练习

1 略
2 100! = 9.33262e+157,这个值是long double类型吗?(sizeof查看,long double和double一样都是8字节)

3 用的do while

4 还是用的do while,先计算了一次。要过27年才能超过

5 略
6 略
7 交替cin读取数值和字符串,读取数值后,用cin.get()清空缓冲区。另外注意用new来创建结构构成的动态数组的方式:Car* carArray = new Car[carNum];

8 怎么读字符串而不是字符?这题看答案了。
直接cin>>word,如果遇到了空格(章节4.2 P65,空格、制表符、换行符等),就确定了字符串结束的位置,存入了word。然后通过strcmp()来比较C风格字符串。

9

10

999. Ref

  1. C语言中关于float、double、long double精度及数值范围理解:https://blog.csdn.net/KLFTESPACE/article/details/81150481
  2. C++ Primer Plus(第6版)中文版习题解答:https://www.epubit.com/bookDetails?id=UB71fac65f02978
  3. 上面的网盘:https://box.lenovo.com/l/8uf85O

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 cdd@ahucd.cn

×

喜欢就点赞,疼爱就打赏

B站 cdd的庇护之地 github itch