c++ primer Plus (第六版)第五章学习笔记

1、cout可以输出表达式的值,在不特殊设置的情况下,若表达式为判断表达式则输出的是0/1,若为赋值表达式则将修改其中的变量值,注意在输出表达式的值时要加将表达式加(),因为<<的优先级高于表达式中的运算符。

例:

#include<stdafx.h>
#include <iostream>
using namespace std;

int main()

{
	int x;
	cout <<(x = 100) << endl;//为赋值表达式,输出表达式的值得同时对x赋值,必须加(),其优先级低于<<
	cout << (x < 3) << endl;//比较表达式输出0/1
	cout.setf(ios_base::boolalpha);//将比较表达式的输出值改为bool型
	cout << (x < 3) << endl;//输出false
	return 0;
}

2、for循环新增的规则(对c)

允许在for循环的初始化部分声明变量,且该变量的生命周期只在for循环中,离开后便无效。

 

3、递增、递减运算符和指针

   a、递增、递减运算符和顺序点、副作用:++p表示在使用p的值之前使p+1,p++表示在使用p之后p++;但对于语句for(;;p++),for(;;++p)而言效果是相同的,因为其中p并没有实际用于那个变量,都表示在()执行后使p+1。另外,c++是在程序的顺序点处对语句的副作用进行评估的,即对于语句for(;p<10;p++)cout<<p;()后面为一个顺序点,也就是意味着该条语句的执行顺序为:先判断p?<10然后p+1,再输出p;而不是先判断然后输出p,再p+1。一般而言,c++是以一条语句结尾为一个顺序点判断的,即对于语句:y=(4 + x++)+(6 + x++);系统不会对先将x++再计算4+还是先4+再x++,程序只会在下一条语句之前将x++两次,计算完成整个表达式。

  b、递增递减运算符前后缀和指针的混合运算

      优先级:前/后缀递增、递减与解除引用运算符优先级相同,后缀的优先级高于前缀;但前缀与解除引用运算符是右结合方式(从右向左计算),后缀是左结合方式(从左向右计算);

例:

①x=*++pt;由于前缀的*与++优先级相同且为右结合方式所以先即计算++pt使pt指向arr[1],再计算*,即x最后值为32.8,且pt指向arr[1];

②x=++*pt;右结合方式,先计算*pt为21.1,再++,即x=21.1;

x=*pt++;首先看优先级,后缀高于前缀所以++先于pt结合,时pt指向arr[1]=32.8;注意虽然pt是先于++结合,但由于后缀是先使用值再改变值,所以再计算*pt,所以x最后值为21.1而不是32.8,在下次使用*pt时其值为32.8。

5、clock()函数实现延时时间

使用clock()返回一个从程序开始执行后所用的系统时间,但由于不同的系统该返回值得类型不同,所以在ctime头文件中定义了一个符号常量CLOCK_PER_SEC,等于每秒钟包含的系统时间单位数,将秒数*CLOCK_PER_SEC得到以系统时间为单位的时间,可用于与clock()返回值比较,用于延迟时间判断,clock_t为clock()函数返回值的类型名,即用于存储为以系统时间为单位的时间值。

6、cin.get函数重载问题

函数重载是指对于相同的函数名允许有不同种类的参数列表实现不同功能,c++会根据参数不同自动对这种函数进行重载;例:cin.get(数组名,数组长度)则表示输入一行字符,cin.get(char)表示输入一个字符(不会忽略空格和换行符),cin.get()没有参数,一般用于吸收末尾的换行符。

例: 

#include<stdafx.h>
#include <iostream>
#include<ctime>
using namespace std;
int main()

{
	
	double sec;
	cout << "enter the delay time,in seconds: ";
	cin >> sec;//要延迟的秒数
	clock_t delay = sec * CLOCKS_PER_SEC;//得到以系统时间单位为单位的时间数
	clock_t start = clock();//start为程序执行到当前语句的系统时间
	while (clock()-start<delay)//clock()f返回执行到当前程序所用的系统时间,减去程序执行到前一条语句所用的时间为延迟的时间
		;
	cout << start<<endl<<delay;
	return 0;
}

7.定义类型的别名

 1)使用预处理器方式  #define BYTE char,将所有的char用BYTE替代,但在声明多个变量时会出现问题。

例:#define FLOAT_POINTER float*;

FLOAT_POINTER Pa,PB;

这两条语句本意是要将指向float类型的指针类型定义为FLOAT_POINTER别名,再声明两个指针变量,但系统会将后面一条语句转换为 float *Pa,PB;即将第一个Pa定义为指针后面一个为float型变量;

 2)使用关键字typedef

typedef FLOAT_POINTER float*

FLOAT_POINTER pa,ba;不会出现用define定义出现的问题

注意:不论哪种定义方式都只是定义了一个类型的别名,而不会创建一个新的别名。

8、使用键盘模拟文件尾条件识别输入文件结束条件

在Windows系统,当需要输入的文件输入结束后,即在按下enter键后,在同时按下ctrl+z键会在输入窗口出现^Z字符,此时再按下enter键,则系统会将其视为输入结束,cin.fail()和cin.eof()函数将返回ture,作为标志位,可利用此标志位进行文件结束标志。

注意:ctrl+z必须在文件输入完成按下enter后,不应将其与文本连续输入,不能识别

9、逗号作用

   1)用于将用于将两个表达式合并为一个,用于将多个表达式放在只允许放一个表达式的地方。例:++j,--i;

    2)用于声明多个相同类型的变量。例:int i,j;

    3)用于逗号运算符,特点为表达式中一般包含=,此时逗号运算符的优先级最低,且整个表达式的值为逗号右侧表达式的值 。例:int x=(1,024);由于等号右侧的表达式有括号所以其优先级高,括号内包含一个逗号运算符,括号内表达式的值为逗号右侧表达式的值即024(八进制数),即整个表达式等价于int i=024;

    int y =1,024;此时等号右侧包含一个逗号运算符,但是其优先级最低,所以等价于(int y=1),024;表示将y初始化为1,但是整个表达式的值(没有使用)为024。

猜你喜欢

转载自blog.csdn.net/Schlangemm/article/details/83306433