【c++ primer plus】第五章-循环和关系表达式

计算机对数据进行存储外,还可以对数据进行分析,合并,重组,抽取,修改,推断,合成和其他操作。

for循环

  • 一定要设置初始值
  • c++语法将整个for语句看成一条语句,虽然循环体中包含多条语句。
  • 循环只进行一次初始化
  • text-expression(测试表达式)决定循环体是否可以执行,可以是任意表达式,但是c++会强制将其转化为bool型。

注:for ()后面加空格,但是函数名与括号之间的空格可以省略。

表达式和语句

c++是非常具有表现力的语言,任何值或者任何有效值和运算符都是表达式,每个C++都有值。左侧是成员的值,

x=y=z=0;这种方法可以将若干个变量快速赋值成相等的值,输出运算符的优先级比表达式中使用的运算符高。

cout在显示bool值时将他们转化成int型,函数cout.setf(ios::boolalpha)调用一个设置标记,将他转化成一个true或者是false。

注:判定表达式x=100时必须执行赋值,将x的值改变成100,改变x在内存中数据的值,这说明表达式有副作用(side effect)但是不是所有表达式都有副作用如x+15不会将x赋一个新值。

修改步长代码

#include<iostream>
//using namespace std;
int main()
{
	using std::cout;
	using std::cin;//使用using声明而不是使用using编译指令
	using std::endl;
	cout << "enter an integer";
	int by;
	cin >> by;//由用户自己控制输入的步长是多少
	cout << "counting by" << by << "s\n";
	for (int i = 0; i < 100; i = i + by)
		cout << i << endl;
	system("pause");
	return 0;
}

使用for循环访问字符串

for循环提供一种一次访问字符串中每一个数字的方式,可以使用string定义也可以使用char数组访问。

#include<iostream>
#include<string>
using namespace std;
int main()
{
	cout << "enter a word";
	string word;
	cin >> word;
	for (int i = word.size() - 1; i >= 0; i--)
		cout << word[i];
	system("pause");
	return 0;
}

注:注意求元素个数的方法。

递增运算符和递减运算符

副作用和顺序点

副作用(side effect):指的是在计算表达式时对某一种东西(如存储在变量中的值)进行改变。

顺序点:程序执行过程中的点。c++中语句中的一个分号就是顺序点,这意味着执行下一条语句之前所有的递增运算符递减运算符和赋值运算符都必须修改完成。

while(guests++<10)
cout<<guests<<endl;

注:确保副作用(执行+1指令)进入cout之前完成。意味着先在cout语句中使用guests在将它加1.

完整表达式例子:while括号中的表达式。它是一个完整的表达式,也是一个顺序点,完整表达式他不是另一个更大的表达式的子表达式。

y=(4+x++)+(6+x++);

注:表达式4+x++不是一个完整的表达式,因此C++不确定计算表达式4+x++之后加1,因为例子是一个完整的表达式,所以c++只保证执行下一条语句之前保证x++两次,但是没有规定是计算子表达式后加x还是计算完整个表达式之后加x,

因此应该避免这样赋值。

c++11使用的是顺序概念,它表示有些事件在其他事件前发生,这种描述方法并非要改变规则,而是想更清晰的描述多线程编程

前缀风格和后缀风格

x++;

++x;

对于内置类型,前缀和后缀没有区别,但对于用户定义的类型,如果有用户定义的运算符则前缀的速度更快,前缀是将值+1然后返回结果,后缀是先复制一个副本在+1在返回结果。

递增运算符和指针

#include<iostream>
using namespace std;
int main()
{
	double arr[5] = { 21.1,32.8,23.4,45.2,37.4 };
	double* pt = arr;
	++pt;
	//解引用运算符和递增运算符和递减运算符同时应用于指针
	//将什么进行解引用,将什么递增
	//取决于优先级,他们的优先级相同,因此将值右往左进行计算
	system("pause");
	return 0;
}

组合赋值运算符

k=k+3;
k+=3;

复合语句(语句块)

for的花括号就是一个语句块,在语句块中定义新的变量时只有在语句块中才起作用。该变量在执行语句结束后释放变量。

#include<iostream>
using namespace std;
int main()
{
	int x = 20;
	{
		int y = 100;
		cout << x << endl;
		cout << y << endl;
	}
	cout << x << endl;
	cout << y << endl;//显示y是未定义的标识符
	system("pause");
	return 0;
}

注:如果是同时在块外和块内对同一个变量进行赋值,块内则块内有效,外则外有效。

逗号运算符

逗号不总是逗号运算符,int i,j;逗号运算符是一个顺序点,将前一个运算符进行计算然后将第二个运算符进行计算。在c++中,逗号运算符的优先级是最低的。逗号表达式的值是第二个表达式的值。

cats=(17,20);将值赋值为17,20不起作用。
i=20,j=2*i;j最终的值是40

赋值、比较和可能犯的错误

==与=;

c-风格字符串的比较-strcmp()

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	char word[5] = "?ate";
	for (char ch = 'a'; strcmp(word, "mate"); ch++);//直接另字符进行++
	{
		cout << word << endl;
		word[0] = ch;
	}
	cout << "after loop ends,word is" << word << endl;
	system("pause");
	return 0;
}

假设想知道字符串是否是某一串字符时,应该使用strcmp()函数进行比较。

注:也可以使用c++string来进行比较。

  • 该函数是接收两个字符串的地址作为参数,这意味着参数可以是指针,字符串常量或者是字符数组名。
  • 两字符串相同返回0,一在后前返回一个赋值,一按字母顺序排在后则返回一个正值。
  • c风格中不同长度的数组可以具有相同的字符串
  • 关系运算符可以比较字符,不可以比较字符串。

while循环

whlie循环是没有初始条件和更新部分的for循环

while (test-condition)

        body

类型别名

#define byre int
typedef char pate

基于范围的for循环c++

这简化了额一种正常循环的任务,对数组或容器类的每一个元素执行相同的操作。

#include<iostream>
using namespace std;
int main()
{
	double prices[5] = { 1.1,2.1,3.1,4.1,5.1 };
	for (double x : prices)//显示出数组的5个元素
		cout << x << endl;
	//将数组元素进行更换
	for (double& x : prices)//取地址符号表明x是一个引用变量
		x = x * 0.8;
		cout << x << endl;
	//还可以结合for循环和初始化列表
		for (double x : {3, 3.1, 4})
			cout << x << " " << endl;
	system("pause");
	return 0;
}

循环和文本的输入

循环重要的一项工作是逐字符从键盘读取用户输入的文本,c++中cin有三种输入方式,且c++与c的方法是不同的,因为io口不同。

使用原始文本cin进行输入

#include<iostream>
using namespace std;
int main()
{
	char ch;
	int count = 0;
	cout << "enter characters;enter #to quit:\n";
	cin >> ch;
	while (ch!= '#')//注意格式的书写,不然代码将显示错误
	{
		cout << ch;
		++count;//为什么是count++
		cin >> ch;
	}
	cout << endl << count << "characters read" << endl;
	system("pause");
	return 0;
}

注:程序要使用循环来输入,则应该知道什么时候停止对键盘输入的读取,所以应该设置哨兵字符,将其作为停止标记。

为什么程序在输出的时候省略了空格?

cin忽略空格和换行符,而且输入给cin的值被缓冲,这意味着当用户按下回车键后记数内容才会被发送给程序。

使用cin.get(char)进行补救

它可以对输入的字符进行检查,包括空格,制表符和换行符,cin所属的iostream中cin.get(char)可以进行这一项检查,它调用的是&ch。

#include<iostream>
using namespace std;
int main()
{
	char ch;
	int count = 0;
	cout << "enter characters;enter #to quit:\n";
	//cin >> ch;
	cin.get(ch);//为什么加入这一行代码之后记数显示少1,因为没有屏蔽掉上一行代码
	while (ch!='#')
	{
		cout << ch;
		++count;//为什么是count++,都是一样的
		cin >> ch;
	}
	cout << endl << count << "characters read" << endl;
	//system("pause");
	return 0;
}

注:输入时空格也一起计算进去。后面的空格也一起记数。

文件尾条件

  • 使用符号#表示输入结尾,很难令人满意,因为它也可以是合法的输入部分,如果输入来自文件,则可以使用更强大的技术——检测文件尾(EOF)。
  • 输入来自文件与cin有两个相关联的地方,<重定向运算符,很多操作系统都支持重定向,允许文件输入代替键盘输入
  • gofish<fishtale:这样程序将从文件fishtale获取输入
  • 很多操作系统还会通过键盘来模拟尾部文件,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值