chapter 5循环和关系表达式
- 5.1 for循环
- 5.2 while循环
- 5.3 do while循环
- 5.4 基于范围的for循环
- 5.5 循环和文本输入
- 5.6 嵌套循环和二维数组
- 5.7 复习题
- 1. 入口条件循环和出口条件循环的区别是什么?各种C++循环分别属于其中的哪一种?
- 2. 如果下面的代码片段是有效程序的组成部分,它将打印什么内容?
- 3. 如果下面的代码片段是有效程序的组成部分,它将打印什么内容?
- 4. 如果下面的代码片段是有效程序的组成部分,它将打印什么内容?
- 5. 如果下面的代码片段是有效程序的组成部分,它将打印什么内容?
- 6. 编写一个打印1、2、4、5、16、32、64的for循环,每轮循环都将计数变量的值乘以2。
- 7. 如何在循环体中包括多条语句?
- 8. 下面的语句是否有效?如果无效,原因是什么?如果有效,它将完成什么工作?
- 9. 在查看输入方面,cin>>ch同cin.get(ch)和ch=cin.get()有什么不同;
5.1 for循环
5.1.1 for循环(先判断关系表达式,在执行循环体,)
for(intialization; test-expression;update-expression)
body
另一种for循环,在初始化处声明,语句如下:
for(fot-init-statement condition;expression)
注:循环结束后声明的变量将消失
5.1.2表达式&语句
赋值运算符=
是从右向左结合的。
C++表达式是值或值与运算符的结合。
表达式加分号就是语句,反过来说是错误的。
非表达式:例如 int toad
5.1.3 递增运算符++
&递减运算符--
++i
与 i++
的区别:
对操作数的影响一样,影响的实践不同。
i++是先使用a的值,再加一;++i是先加一,在使用i的值。例如:
int x = 1;
y = ++x; // or y = x++;
y = ++x:y=2,x=2;
y = x++; y=1,x=2.
5.1.4 副作用和顺序点
副作用:计算表达式时对某些东西(存储在变量中的值)进行了修改;
顺序点:程序执行过程中一个点,进入下一步之前确保对所有的副作用都进行评估。
5.1.5 递增/递减运算符和指针
递增运算符用于指针时:将把指针的值增加其指向的数据类型占用的字节数。
前缀运算符的结合规则时从右到左,比如:
*++pt
:*
用于递增后的pt
x = *pt++
,后缀运算符++优先级高,递增后进行解除引用计算。
5.1.6 组合赋值运算符
组合赋值运算符
操作符 | 作用(L左操作数,R右操作数) |
---|---|
+= | 将L+R赋给L |
-= | 将L-R赋给L |
*= | 将L*R赋给L |
/= | 将L/R赋给L |
%= | 将L%R赋给L |
5.1.7 复合语句
{;;;}多条语句,需要执行多条循环语句时使用。
注:for忽略缩进。
5.8 逗号运算符
- 用在for循环表达式中,例:
for(int i = 0,j = n;i < j;i++,j--)
- 作为一个顺序点,先计算第一个表达式,再计算第二个表达式,例:
i = 20, j = 2 * i;
- 逗号运算符的优先级最低,例如:
cats = 17, 240
: 结果 cats = 17,先=
,再,
5.1.9 关系运算符
注:关系运算符的优先级比算数运算符低。
5.1.10 C-风格字符串的比较
字符串数组不能用关系运算符==来比较,应该用函数strcmp(a,b),其中a,b可以是指针、字符串常量、数组名。其返回结果:
- 0 两个字符串相同
- 正数 a按字母排序排在b之后
- 负数 a按字母排序排在b之前
结合strcmp(a,b)与关系运算符可以实现特定的比较返回true,否则返回false。
注:string类字符串对象可以使用关系运算符比较
5.2 while循环
- while循环没有初始化与更新部分,他只有测试条件和循环体:
while(test-conditon)
body
判断字符数组name结尾时,通常用:while(name[i])
。
5.2.1 for与while
下面的while循环:
while(test-expression)
body
可以改写成:
for(;test-expression;)
body;
5.2.2 时延循环
头文件#include<ctime>
函数clock()
返回当前系统时间;
CLOCKS_PER_SEC
以秒计算时间。
5.2.3 类型别名
C++为类型建立别名的方式有两种。
- 使用预处理器
#define BYTE char
,用char替换所有的BYTE。 - 使用关键字typedef
通用格式:typedef typeName aliasName;
注:typedef不会创建新类型,只是为已有的类型建立一个新名称
5.3 do while循环
do while循环的句法为:
do
body
while(test-expression);
5.4 基于范围的for循环
C++11新增的循环:简化了一种常见的循环任务:对数组(或容器类,如vector和array)的每个元素执行相同的操作。例如:
double prices[5] = {4.99, 10.22, 3.22, 4.22, 5.66};
for(double x:prices)
std::cout << x << std::endl;
// another change value
for(double &x:prices)
x = x * 0.8;
5.5 循环和文本输入
5.5.1 使用cin进行输入
注:cin会忽略空格和换行符
5.5.2 使用cin.get(ch)输入
注意cin.get()里面时ch,不是&ch。
cin.get()有多个版本,是函数重载的知识。
cin.get(a,b):a是数组名,b是数组的大小;
cin.get():得到任意一个字符;
cin.get(char):得到一个参数
5.5.3 文件尾条件
- 输入来自于文件,可以采用检测文件尾(EOF)
UNIX通过Ctrl+D
来实现,Windows通过Ctrl+Z
来实现。
<
符号是Unix和Windouws命令提示符模式的重定向运算符。
1. EOF结束输入
cin方法检测到EOF时,将设置cin对象中一个指示EOF条件的标记,设置该标记后,cin不在读取输入,再次调用也不管用,对文件输入来说合理,对键盘输入来说,不合理,要想继续输入,可以用cin.clear()方法清除EOF标记。
2. 常见的字符输入法
while(cin.fail()==false)
while(!cin.fail())
while(cin)
while(cin.get(ch)) // while input is successful
{
... //do stuff
}
cin.get(char)只被调用一次,而不是两次why?
5.5.5 另一个cin.get()版本
ch=cin.get(),该函数返回字符编码的int值
EOF不表示输入中的字符,他指出没有字符。
while((ch = cin.get()) != EOF)
注:!=
运算符的优先级高于=
,因此第二个()不能去掉
cin.get(ch)与cin.get()
属性 | cin.get(ch) | ch=cin.get |
---|---|---|
传递输入字符的方式 | 赋给参数ch | 将返回值赋给ch |
用于字符输入时函数的返回值 | istream对象(执行bool转换为true) | int类型的字符编码 |
到达EOF时函数的返回值 | istream对象(执行bool转换为false) | EOF |
5.6 嵌套循环和二维数组
5.6.1 初始化二维数组
int maxtemps[4][5]=
{
{33, 33, 22, 33, 44},
{34, 22, 24, 45, 54},
{43, 34, 43, 34, 35},
{56, 64, 46, 77, 75}
};
5.6.2 使用二维数组
for(int j = 0; j < col; ++j)
for(int i = 0; i < row; ++i)
cout << temp[i][j] << "\t";
可以先列后行,同时使用制表符
5.7 复习题
1. 入口条件循环和出口条件循环的区别是什么?各种C++循环分别属于其中的哪一种?
入口条件循环是判断循环条件,再执行循环体:有for循环和while循环。
出口条件循环是先执行循环体,再判断循环条件:有do while循环。
2. 如果下面的代码片段是有效程序的组成部分,它将打印什么内容?
int i;
for(i = 0; i < 5; i++)
cout << i;
cout << endl;
输出:
01234
for的循环体看的是{},不是缩进cout << endl只执行一次。
3. 如果下面的代码片段是有效程序的组成部分,它将打印什么内容?
int j;
for(j = 0; j < 11; j += 3)
cout << j;
cout << endl << j << endl;
输出:
0369
12
4. 如果下面的代码片段是有效程序的组成部分,它将打印什么内容?
int j = 5;
while(++j < 9)
cout << j++ <<endl;
输出:
6
8
5. 如果下面的代码片段是有效程序的组成部分,它将打印什么内容?
int k = 8;
do
cout << " k = " << k << endl;
while(k++ < 5)
cout << j++ <<endl;
输出:
k = 8
6. 编写一个打印1、2、4、5、16、32、64的for循环,每轮循环都将计数变量的值乘以2。
#include<iostream>
int main()
{
using namespace std; //forget writing
int i;
for(i = 1; i < 64; i*=2)
cout << i << "、";
cout << i <<endl;
return 0;
}
7. 如何在循环体中包括多条语句?
将多条语句放入{}中,构成一个代码块。
8. 下面的语句是否有效?如果无效,原因是什么?如果有效,它将完成什么工作?
int x = {1, 024};
下面的语句又如何呢?
int y;
y = 1, 024;
有效,第一句完成x = 24;第二句完成 y = 1;
第一句赋值的024是8进制,转换成十进制是20
9. 在查看输入方面,cin>>ch同cin.get(ch)和ch=cin.get()有什么不同;
第一点:cin>>ch不会读取会跳过空格,制表符,换行符,而cin.get(ch)和ch=cin.get()不会。
第二点:cin>>ch是将字符的ASCII码给了ch,而cin.get(ch)不是。