第五章:循环和关系表达式
for循环的基本结构:
for(initializationl;test_expression;update_expression)
body
C++常用的方法是:在for和括号之间加上一个空格,而省略函数名和括号之间的空格;
C++将赋值表达式的值定义为左侧变量的值;运算符<<的优先级比表达式中的运算符要高;
要让cout在显示0和1的时候显示false和true,可以这么做:
cout.setf(ios_base::boolalpha);
当判定表达式修改了内存中的值的时候,我们称这种判定表达式有副作用;
在C++中for循环还可以写成这样子:
for(for-init-statement condition;expression)
statement;
//说实话我也不知道这到底有什么用
//不过有一点是明确的,用于计数的变量只存在于for循环内,离开循环后自动消失
通常检测不等比检测相等好
string对象类的.size()方法可以获得对象的字符数;
++递增运算符和–递减运算符在对象前面时,先计算值再使用值;在对象后面时,先使用值再计算值;运算符前缀的运算速度比运算符后缀要高;
在C++中,一个分号就是一个顺序点,另外任何完整的表达式都是一个顺序点;
复合语句(花括号包裹的代码块)有一个神奇的特性:在复合语句中定义的变量,离开复合语句后自动销毁;
数组之间不能使用关系运算符,但只要参与运算的双方有string类,就可以使用关系运算符;关系运算符的优先级比算数运算符低;
在比较数组名的时候并不是在比较两个数组是否相等,而是在比较两个数组第一个元素的地址是否相等;
要比较两个字符串要使用标准库中的strcmp(a,b),相等则返回0;
因为字符串是依靠’\0’来结尾的,因此两个不同的数组中存储的字符串可以是相同的;
string字符串可以直接使用双等号来比较,双等号在这里进行了重载;
while循环标准结构
while (test-condition)
body
string对象不使用’\0’来标记字符串的结束;
省略for循环的表达式时循环会一直执行下去;
头文件中的clock()函数返回系统时间,类型是clock_t;常数CLOCK_PER_SEC是每秒钟包含的单位系统时间数;
有两种方法创建类型别名:#define指令或typedef指令,它们只是给现有类型换皮而不产生实际的新类型;
C++也支持基于范围的for循环:
double price[5]={4.99,10.99,6.87,7.99,8.49};
for (double x : prices)
cout<<x<<std::endl;
//显然此语法是借鉴python得到的
cin对象支持三种参数列表的情况,原始的cin用于获取字符并自动忽略空白字符;**发送给cin的字符是被缓冲的,这意味着只有在按下空格后输入才开始发送给cinn;**cin.getchar(dt)会将接受到的字符原封不动的写入到dt中不受传值调用的约束;另对于数组cin.get(数组名,数组长度)将写入一行包括换行符(正常写入会加上结束符,因为超出数组长度导致的异常终止需要手动写入换行符);
操作系统中可以使用<和>符号进行输入输出的重定向
在很多操作系统中可以使用Ctrl+Z+Enter模拟文件结束符
检测到EOF后cin会将两位(eofbit和failbit)都设置为1,分别调用cin.eof()或cin.fail()来获取状态信息;
书上的原话:它使用的是fail(),而不是eof(),因为前者可用于更多的实现中;
cin对象检测到EOF标记后,将设置一个cin对象中指示EOF的标记,设置这个标记后cin将停止读入,再次调用cin也不管用,除非调用cin.clear();有些系统中即使使用cin.clear()也无法恢复输入!
cin对象中有一个将结果转换为bool对象的函数,当cin出现在需要bool对象的环境时,该函数就会被调用,另外cin最后一次读取成功时为true,不成功时为false(这可以捕获文件结束之外的异常,比如磁盘故障)
不接受任何参数的cin.get()返回一个接受到的字符;cin.put(ch)显示一个字符;
EOF通常被定义为-1;char类型不能储存EOF,需要int;
注意:cin.get(ch)会返回一个istream对象,这意味着可以将它们拼接起来
二维数组的初始化由一系列都好隔开的一维数组(用花括号扩起)组成;在输出中使用制表符比使用空格的排版效果好;