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 | for (init-expression; test-expression; update-expression) |
可以改写成这样:
1 | init-expression; |
同样,下面的while循环:
1 | while (test-expression) |
可以改成这样:
1 | for (;test-expression;) |
C++为类型建立别名有两种方式。一种是使用预处理器,如#define BYTE char
,另一种是使用typedef来创建别名typedef char byte;
,通用格式为typedef typeName aliasName;
.
5.3 do while 循环
do while循环是出口条件(exit condition)循环。这种循环将首先执行循环体,然后再判定测试表达式,决定是否应该继续执行循环,如果条件为false,则循环终止;否则进入新一轮循环。
5.4 基于范围的for循环
C++新增了一种循环:基于范围(range-based)的for循环(与Java中的for-each循环类似),这简化了一种常见的循环任务:对数组(或容器类)的每个元素执行相同的操作。例如:
1 | double prices[5] = {4.99, 10.99, 6.87, 7.99, 8.49}; |
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。