1. for 循环
1. 1 for 循环的组成部分
- 设置初始值。
- 执行测试,看循环是否应当继续进行。
- 执行循环操作。
- 更新用于测试的值。
初始化,测试和更新操作构成了控制部分,这下操作有括号括起。每个部分都是一个表达式,彼此由分号隔开。控制部分后面的语句叫做循环体,只要测试表达式为 true,它便被执行:
for (initialization; test-expression; update-expression)
body
test-expression 决定循环体是否被执行。
update-expression 在每轮循环结束时执行,此时循环体已执行完毕。
C++ 允许在for循环的初始化部分中声明变量。这种变量只存在于 for 中。当程序离开循环后,这种变量将消失。
1. 2 递增运算符(++)和递减运算符(–)
两个运算符执行两种及其常见的循环操作:将循环计数加 1 或减 1。
这两个运算符都有两种变体,前缀(prefix)版本位于操作数前面,如 ++x;后缀(postfix)版本位于操作数后面,如 x++。两个版本对操作数的影响是一样的,但是影响的时间不同。
对于:
int a = 20;
cout << "a = " << a << ", b = " << b << endl;
cout << "a = " << a++ << ", b = " << ++b << endl;
cout << "a = " << a << ", b = " << b << endl;
输出结果:
a = 20, b = 20
a = 20, b = 21
a = 21, b = 21
这里,a++ 意味着使用 a 的当前值计算表达式,然后将 a 的值增加 1。而 ++b 的意思是先将 b 的值加 1,然后使用新的值来计算表达式。
1. 3 组合运算符
操作符 | 作用(L 为左操作数,R 为右操作数) |
---|---|
+= | 将 L+R 赋给 L |
-= | 将 L-R 赋给 L |
*= | 将 L*R 赋给 L |
/= | 将 L/R 赋给 L |
%= | 将 L%R 赋给 L |
1. 4 关系运算符
操作符 | 含义 |
---|---|
< | 小于 |
<= | 小于或等于 |
== | 等于 |
> | 大于 |
= | 大于或等于 |
!= | 不等于 |
1. 5 C-风格字符串的比较
对于检测字符数组的字符串是不是 mate ,不能使用 ==。数组名是数组的地址,用引号括起的字符串常量也是其地址。因此
word == "mate"
以上关系表达式不是判断两个字符串是否相投,而是查看它们是否存储在相同的地址上。
应使用 C-风格字符串库中的 strcmp() 函数来比较。该函数接受两个字符串地址作为参数,参数可以是指针、字符串常量或字符数组名。
如果两个字符串相同,该函数返回零;如果第一个字符串按字母顺序排在第二个字符串之前,则 strcmp() 将返回一个负数值。如果第一个字符串按字母顺序排在第二个字符串之后,则 strcmp() 将返回一个正数值。
2. while 循环
while 循环是没有初始化和更新部分的 for 循环,他只有测试条件和循环体:
while (test-condition)
body
如果测试条件表达式为 true,则执行循环体中的语句。
类型别名
C++ 为类型建立别名的方式有两种。
第一种是使用预处理器:
#define BYTE char // preprocessor replaces BYTE with char
第二种是使用 C++ 的关键字 typedef 来创建别名。例如,要将 byte 作为 char 别名:
typedef char byte;
通用格式如下:
typedef typeName aliasName;
3. do while 循环
do
body
while (test-expression)
这样的循环通常至少执行一次,因为其程序流必须经过循环体后才能到达测试条件。
4. 基于范围的 for 循环
double prices[5] = {4.99, 10.99, 6.87, 7.99, 8.49};
for (double x : prices)
cout << x << endl;
要修改数组的元素,需要使用不同的循环变量语法:
for (double &x : prices)
x = x * 0.80;
还可以结合使用基于范围的 for 循环和初始化列表:
for(int x : {3, 5, 2, 8, 6})
cout << x << " ";
cout << "\n";
5. 循环和文本输入
5. 1 使用原始的 cin 进行输入
char ch;
int count = 0;
cin >> ch;
while (ch != '#')
{
cout << ch;
++count;
cin >> ch;
}
这里 ‘#’ 被称为哨兵字符,用来作为停止标记。
cin 会忽略空格和换行符,因此既不会被显示也不会被包括在计数内。发送给 cin 的输入被缓冲,只有在按下回车后,输入的内容才会被发送给程序。
5. 2 使用 cin.get(char)
char ch;
int count = 0;
cin >> ch;
while (ch != '#')
{
cout << ch;
++count;
cin.get(ch);
}
cin.get(ch) 调用将一个值放在 ch 变量中。此方法可以将全部字符计算在内,包括空格。输入仍被缓冲,因此输入的字符个数仍可能比最终到达程序的要多。