C++primer plus第五章--循环和关系表达式
前面漆黑一片,什么也看不到。
也不是,天亮后会很美的。
其实我是一个演员。
--------------------不是新喜剧之王的新喜剧之王
一.入口条件循环。
1.for循环
for语句看上去有些像函数调用,因为它后面跟一个括号,然而它是一个C++关键字,也防止将for命名为函数。
for(initialization【1.执行一次】;test-express【2.通常为关系表达式,决定是否执行body,由于是表达式就行注意错误!!将表达式的值转化为true或false且省略时为true】;update-expression【4.最后执行】)
body【3.一个语句(可以是复合语句即代码块)】
每部分都是一个表达式(任何值或任何有效的值和运算符的组合),表达式加分号即为语句,反过来不行,返回语句,声明语句,for语句都不满足“语句=表达式+分号”的模式,如xi=int xixi + 3;是非法的。(可能由于必须声明并初始化后再使用更加安全,不能直接用),另外C++将赋值表达式的值定义为左侧值。
C++新增特性:定义一种新的表达式【声明语句表达式】(生命周期为整个循环),可以在循环中声明初始化变量,为了方便不择手段,哈哈哈哈。
C++11新增特性:基于范围的循环,简化了循环任务,对数组(或容器类如vector和array)的每个元素执行相同操作。
int xi[3]={1,2,3};
for(int x:xi)// 修改x时可使用 &x,for(int &x:xi)
cout<<x<<endl;
还可使用初始化列表
for(int x: {1,2,3})
cout<<x<<" ";
逗号运算符:优先级是最低的,允许将两个表达式放到只允许一个表达式的地方。有两个特性:1.是一个顺序点,先计算第一个,然后计算第二个。2.逗号表达式的值是第二部分的值。
另外逗号不总是运算符,它在声明语句中分隔变量名。
递增/递减运算符和指针,前缀递增,递减和解引用优先级相同,从右到左结合,后缀递增,递减运算符比前缀运算符的优先级高,从左往右进行结合。注意分析:*p++:由于++的优先级高,用于p,而不是*p,先解引用,再将p+1;
表达式的值未使用的前提下,前缀和后缀的格式对程序的行为没有影响,但执行速度可能有差异,对用户自定义的类++运算符,这样定义前缀:将值+1返回结果;后缀:复制副本,将其+1,返回副本的值。
对于内置类型,哪种格式没有差别,但对于用户定义的递增和递减运算符,前缀效率更高。
后缀运算符在顺序点(完整表达式的末尾或分号)之前(没有决定顺序,在子表达式还是整个表达式完成之后)完成运算。避免这种情况出现:y=(4+x++)+(6+x++);//注意带括号的表达式
2.while循环,可转化为for循环.
二.出口条件循环.
do
body
while(test-expression);(注意不要漏掉分号)
用于先输入后测试情况。
三.嵌套循环和二维数组
C++没有提供二维数组类型,但用户可以创建每个元素本身都是数组的数组。
int a[3][3];
从存储空间的角度说,使用指针数组更为经济,如果要修改任何一个字符串,二维数组是更好的选择。
四.循环和文本输入.
注意:好像下面任意三种单字符输入方式之一,都能将cin对象转化为false.
istream类提供了一个可以将istream对象转化为bool值的函数,当cin需要bool值的地方,该转换函数将被调用。
1.cin忽略空格和换行符,更为复杂的是发送给cin的输入被缓冲,这意味着只有用户按下回车键后,他输入的内容才会被发送给程序。
属性 | 2.cin.get(ch) | 3.ch=cin.get() |
传递输入字符的方式 | 赋给参数ch | 将函数返回值赋给ch |
用于字符输入时函数的返回值 | istream对象(执行bool转换true) | int类型字符编码 |
到达EOF时函数的返回值 | istream对象(执行bool转换false,输入失败)不会赋值给ch |
EOF,赋值给ch,一般为-1,是头文件中的符号常量 |