第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()返回类型的别名,建立别名的两种方式:
- #define BYTE char
- 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
- C语言中关于float、double、long double精度及数值范围理解:https://blog.csdn.net/KLFTESPACE/article/details/81150481
- C++ Primer Plus(第6版)中文版习题解答:https://www.epubit.com/bookDetails?id=UB71fac65f02978
- 上面的网盘:https://box.lenovo.com/l/8uf85O
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 cdd@ahucd.cn