Chapter5 循环和关系表达式

Chapter5 循环和关系表达式

5.1 for循环

C++在for和括号之间加上一个空格,而省略函数名和括号之间的空格,这样从视觉上强化了控制语句和函数调用之间的区别。

递增运算符(++)和递减运算符(–)对操作数的影响是一样的,但是影响的时间不同。粗略的讲,a++意味着使用a的当前值计算表达式,然后将a的值加1;而++a的意思是先将a的值加1,然后使用新的值来计算表达式。(对于用户定义的类型而言,前缀版本比后缀版本效率高。因为后缀版本会首先复制一个副本,将其进行自增运算后再将复制的副本返回,而前缀版本直接返回加1后的结果)

副作用(side effect)指的是在计算表达式时对某些东西(如存储在变量中的值)进行了修改;顺序点(sequence point)是程序执行过程中的一个点,在这里,进入下一步之前将确保对所有的副作用都进行了评估。(C++中的分号就是一个顺序点,任何完整的表达式末尾都是一个顺序点

前缀递增、前缀递减和接触运算符的优先级相同,以从右到左的方式进行结合。后缀递增和后缀递减的优先级相同,但比前缀运算符的优先级高,这两个运算符以从左到右的方式进行结合。

逗号运算符去额宝先计算第一个表达式,然后计算第二个表达式(逗号运算符是一个顺序点),它的值是第二部分的值,再所有表达式中都好运算符的优先级是最低的。

数组名是数组的地址,用引号括起来的字符串常量也是其地址。

C-风格字符串应使用strcmp()函数来比较。该函数接受两个字符串地址作为参数。如果两个字符串相同,该函数返回零;如果第一个字符串按字母顺序排在第二个字符串之前,则strcmp()将返回一个负数值;如果第一个字符串按字母顺序排在第二个字符串之后,则strcmp()将返回一个正数值。

5.2 while循环

while循环时没有初始化和更新部分的for循环,它只有测试条件和循环体:while(test-condition){body}.

在C++中,for和while循环本质上是相同的。例如,下面的for循环:

1
2
3
4
for (init-expression; test-expression; update-expression)
{
statement(s);
}

可以改写成这样:

1
2
3
4
5
6
init-expression;
while (test-expression)
{
statements(s);
update-expression;
}

同样,下面的while循环:

1
2
while (test-expression)
body

可以改成这样:

1
2
for (;test-expression;)
body

C++为类型建立别名有两种方式。一种是使用预处理器,如#define BYTE char,另一种是使用typedef来创建别名typedef char byte;,通用格式为typedef typeName aliasName;.

5.3 do while 循环

do while循环是出口条件(exit condition)循环。这种循环将首先执行循环体,然后再判定测试表达式,决定是否应该继续执行循环,如果条件为false,则循环终止;否则进入新一轮循环。

image-20201012160021241

5.4 基于范围的for循环

C++新增了一种循环:基于范围(range-based)的for循环(与Java中的for-each循环类似),这简化了一种常见的循环任务:对数组(或容器类)的每个元素执行相同的操作。例如:

1
2
3
4
5
6
double prices[5] = {4.99, 10.99, 6.87, 7.99, 8.49};
for (double x: prices)
std::cout << x << std::endl;
//如需修改数组的元素,使用引用即可
for (double &x: prices)
x *= 0.80;

5.5 循环和文本输入

函数重载允许创建多个同名函数,条件是它们的参数列表不同。

很多PC编程环境都将Ctrl+Z视为模拟的EOF。如果检测到EOF,cin将两位(eobit和failbit)都设置为1,则cin.eof()将返回bool值true,否则返回false。

总结

for循环和while循环时入口条件循环,这意味着程序将在执行循环体中的语句之前检查测试条件。do while循环是出口条件循环,这意味着其将在执行循环体中的语句之后检查条件。

如果ch是一个char变量,cin >> ch;将输入的下一个字符读入到ch中,然而,它将忽略空格、换行符和制表符。

cin.get(ch)读取输入中的下一个字符(而不管字符是什么)并将其存储到ch中。

成员函数调用cin.get()返回下一个输入的字符(包括空格、换行符和制表符),因此可以这样使用它ch = cin.get().

cin.get(char )成员函数调用通过返回转换为false的bool值来指出已到达EOF,而cin.get()成员函数调用则通过返回EOF值来指出已到达EOF。