第五章

5.1 for循环

组成

for (initialization; test-expression; update-expression)
body

表达式和语句

赋值表达式的值定义为左侧成员的值
cout.serf(ios::boolalpha); // 设置使cout显示true/false, 而不是1和0
加分号是语句, 不加分号是表达式
非表达式:声明、for语句等
可以在for语句中声明变量

递增运算符(++)和递减运算符(--)

前缀:先改变值, 再使用变量
后缀:先使用变量, 再改变值
对于类而言, 重定义递增递减运算符, 前缀的效率比后缀高

组合赋值运算符

+=、*=、/=、-=、%=

复合语句

花括号括起来的语句

逗号运算符

可以将两个表达式合为一个, 先计算第一个表达式, 再计算第二个表达式, 整个表达式的值是第二个表达式的值
--i, ++j
string反转字符串在十六章介绍

关系表达式

比较string类字符串

!=

5.2 while 循环

while (test-condition)
body

时间

CLOCKS_PER_SEC // 将系统时间除这个值将会得到秒数
clock_t clock(); // 获取当前的秒数, 系统时间

typedef类别名

typedef typeName aliasName;

5.3 do while 循环

do
body
while (test-expression);

基于范围的for循环 C++11

可对数组(或容器类)的每个元素执行相同的操作
double prices[5] = { 4.99, 10.99, 6.87, 7.99, 8.49 };
for (double x : prices)
cout << x << std::end;
修改数组的元素, &:引用变量
for (double &x : prices)
x = x * 0.80;
for (int x : { 3, 5, 2, 8, 6 })
cout << x << " ";
cout << '\n';
这种循环将主要用于16章的讨论各种容器模板类

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

可对数组(或容器类)的每个元素执行相同的操作
double prices[5] = { 4.99, 10.99, 6.87, 7.99, 8.49 };
for (double x : prices)
cout << x << std::end;
修改数组的元素, &:引用变量
for (double &x : prices)
x = x * 0.80;
for (int x : { 3, 5, 2, 8, 6 })
cout << x << " ";
cout << '\n';
这种

5.5 循环和文本输入

使用原始的cin输入

选择某个特殊的字符作为停止标记, 称为哨兵字符

使用cin.get(char)

引用将在第8章介绍

文件结尾条件

EOF
模拟文件尾条件
+
命令行输入
gofish.exe < fishtale
重定向, 从文件fishtale中获取输入
检测到EOF后, 程序将eofbit和failbit都设置为1
cin.fail()
cin.eof()
读取到文件尾后, 将不能再读取内容
char ch;
cin.get(ch);
while (cin.fail() == false)
{
cout << ch;
cin.get(ch);
}
cout << endl;
当cin出现在需要bool值的地方, 就会转换为bool值, 这意味着可以改成
while (cin.get(ch))
如果需要和EOF比较, 应改为
int ch;
cin.get(ch);
while (ch != EOF)
{
cout.put(ch);
cin.get(ch);
}
cout << endl;
重新唤醒cin
istream.clear() // 重置输入流
如果到达文件尾
cin.get(char) // char将不会储存EOF
ch = cin.get() // char将会被放入EOF

5.6 嵌套循环和二维数组

初始化二维数组

使用二维数组