chapter 5循环和关系表达式

目录

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 递增运算符++&递减运算符--

++ii++的区别:
对操作数的影响一样,影响的实践不同。
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)不是。

posted @ 2021-12-06 20:56  Fight!GO  阅读(85)  评论(0编辑  收藏  举报