[关闭]
@Moritz 2019-01-16T05:49:37.000000Z 字数 7753 阅读 576

C++教材(谭浩强)一些细节复习和总结

课程学习 C++ 所有文稿 谭浩强


主要用于准备C++的笔试期末考,内容涵盖第一章到第五章


Chapter1 C++的初步知识


Chapter2 数据的存储、表示形式和基本运算

2.1 C++的数据类型

1字节 byte = 8比特 bit

基本类型 整形 短整型( (unsigned) short [int] , 2B)
整型([signed] int , unsigned [int] , 2B(16位机)/4B(Visual C++) )
长整型((unsigned) long [int] , 4B)
字符型([signed] char (-128~127) ; unsigned char (0~255) , 1B)
浮点型(实型)
单精度型(float ,4B)
双精度型(double ,8B)
长双精度型(long double ,8B)
布尔型(bool)
派生类型 指针类型(*)
枚举类型(enum)
数组类型([])
结构体类型(struct)
共用体类型(union)
类类型(class)
空类型(void)

2.2 常量

2.2.1 数值常量

2.2.2 字符(串)常量

2.2.3 符号常量

#define PRICE 30;

在编译预处理时,所有的PRICE都被替换为字符 30 ,正式进行编译时已经没有PRICE这个标识符。
符号常量不能被赋值,如下列语句则是错误的:

#define PRICE=40;

2.3 变量


2.4 C++运算符

2.4.1 运算符的优先级

(由高到低)

单目运算符,非( + , - , ++ , -- , ! )
乘、除、求余运算符( * , / , % )
加减运算( + , - )
关系运算( < , <= , > , >= )
关系运算( == , != )
逻辑与运算( && )
逻辑或运算( || )
条件运算( ? )
赋值运算( = )
逗号运算( , )

2.4.2 算术运算符与表达式

<高>
double ← float

long

unsigned

int ← char,short
<低>

代码 运算过程 i j
++i 在使用i之前,先使i值加一 4 4
--i 在使用i之前,先使i值减一 2 2
i++ 在使用i之后(先执行 j=i ),i的值加一(表达式值为 i) 4 3
i-- 在使用i之后(先执行 j=i ),i的值减一(表达式值为 i) 2 3

例子2

int i=3;
cout<<++i;//输出4


int j=3;
cout<<j++;//输出3

2.4.3 赋值运算符

右值 (赋给)左值 过程
浮点型 整型 舍弃小数部分
整形 浮点型 数值不变,变为指数形式
double float 注意溢出
字符型 整型 ASCII码值
int/short/long(2或4字节) char(1字节) 只将其低8位赋值(发生截断)
signed unsigned 储存单元内容照搬,连同符号位(第一位)

例子1

short int i=289;//0000000100100001
char c=i;//00000001|00100001
cout<<c;//输出字符'!',ASCII码值为35,00100001

例子2

short int b=-1;//补码形式为1|111111111111111
unsigned short a;
a=b;//1111111111111111 , 即a=65535=2^16-1
/*若b为正值,则赋值后数值不变*/
代码 等价于
a+=3 a=a+3
a%=y+3 a= a%( y+3) , 相当于右边表达式有括号
赋值表达式 解释
a=b=c=5 a , b , c 的值均为5
a=5+(c=6) 表达式的值为11,a 值为11,c 的值为6
a=(b=4)+(c=6) 表达式的值为10,a 值为10 ,b 值为4,c值为6
a=(b=10)/(c=2) 表达式的值为5,a 值为5 ,b 值为10 ,c值为2
cout<<(a=b); 输出和b值相等的值(表达式a=b的值),括号不可省略

2.4.4 逗号运算符

例子

a=3*5,a*4;//先求解a=3*5=15,再将a*4=60的值赋给a

Chapter3 程序设计初步

程序 = 算法 + 数据结构

计算机算法可分为两大类别:数值算法和非数值算法

3.1 C++程序结构和语句

3.2 赋值操作

赋值号 = 是一个赋值运算符,可以下称一下两行等价代码

a=b=c=d;
a=(b=c=d);
/*执行顺序:d→c,c→b,b→a*/

赋值表达式的运用

if ((a=b)>0) cout<<"a>0"<<endl;//正确,先赋值,再判断
if ((a=b;)>0) cout<<"a>0"<<endl;//错误,不是语句,不加';'

3.3 C++的输入与输出

C和C++本身都没有为输入和输出提供专门的语句结构。在C语言中,输入输出的功能是通过调用scanfprintf函数实现的,C++中是通过调用输入输出流库中的流对象cincout实现的。

stream
C++的输入和输出是用的方式实现的。“流”指的是来自设备或传给设备的一个数据流,由一系列字节组成,这些字节是按进入“流”的顺序排列的。

cout输出流对象的名字,cin输入流对象的名字。

流插入运算符<<(也称流插入操作符)
作用是将需要输出的内容插入到输出流中,默认的输入设备是显示器。
流提取运算符>>
作用是从默认设备的输入设备(一般为键盘)的输入流中提取若干个字节送到计算机内存区中制定的变量

有关流对象cincout和流运算符的定义等信息是存放在C++的输入输出流库中的,b不是C++本身提供的语句,需要使用预处理指令吧头文件stream包含到本文件中。

#include <iostream>

定义流对象时,系统会在内存开辟一段缓冲区,用来暂存输入输出流的数据。

在执行cout语句时,并不是插入一个数据就马上输出一个数据,而是先把插入的数据顺序存放在输出缓冲区中,直到缓冲区满或遇到cout语句中的endl'\n'endsflush为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。

getcharputchar

c=getchar();//输入'A'
putchar(c+32);//输出'a',ACSII码值是'A'+32
putchar('\n');

scanfprintf

scanf("%d%c%f",&a,&c,&b);//注意变量名前加地址运算符&,
printf("a=%d,b=%f,c=%c\n",a,b,c);//

3.4 顺序结构

3.5 关系运算和逻辑运算

关系运算符

优先级相同(高)<
<=
>=
>
优先级相同(低)==
!=

逻辑变量

bool在内存中占1B
编译系统处理逻辑型数据时,将flase处理为0,将true处理为1

bool flag=ture;
cout<<flag;//输出 1

将一个非零整数赋给逻辑性变量,则按true处理。

逻辑运算和逻辑表达式

逻辑运算符 && || !
&&||是双目运算符
!是一目运算符
优先级:!→算术运算符→关系运算符→&&||→赋值运算符

3.6 选择结构

if语句

条件运算符?:和条件表达式

条件表达式:表达式1?表达式2:表达式3
先求解表达式1,若该值非0(真),则表达式2就是整个表达式的值;若该值为0(假),则表达式3就是整个表达式的值。

例子

max=(a>b)?a:b;

switch语句

3.7 循环结构

while

do-while

do
{sum=sum+i;
i++;
}while (i<=100)

for

breakcontinue提前结束循环


Chapter4

4.1 什么是函数

函数分类
(1)系统函数,即库函数
(2)用户自己定义的函数:(i)有参函数和(ii)不参函数

4.2 定义函数的一般形式

类型名 函数名([void]/[形参表列])
{声明部分
执行语句
}

4.3 函数参数和函数的值

4.4 函数调用

函数名([实参列表])

4.5 函数的嵌套调用

4.6 函数的递归调用

4.7 内置函数*

即为提高存在频繁使用的函数的程序的效率,在编译时将所调用函数的代码直接嵌入到主函数中,而不是将流程转出去,这种函数叫内置函数 inline function

inline int max(int a,int b){...}//定义和声明时,在左端加上inline

编译系统遇到函数调用 max(i,j) 时,就用 max函数体代替 max(i,j) ,同时实参替代形参。节省运行时间,但增加目标程序的长度。内置函数中不能包括复杂的控制语句,例如循环语句和 switch 语句。

4.8 函数的重载*

下面一个为几个函数定义

int max(int a,int b){}
double max(double a,double b){}
long max(long a,long b){}

函数名 max 分别定义了三个函数,声明也要声明三次!!,系统会根据调用函数时给出的信息去找与之匹配的函数。
重载函数的参数顺序函数体参数个数可以不同(至少有一种不同),声明时每种都要声明一次。

4.9 函数模板*

4.10 有默认参数的函数*

4.11 局部变量和全局变量

局部变量 local variable
在一个函数内部定义的变量是内部变量,只在本函数范围内有效,包括 main 函数。可以使用同名变量。形参是局部变量,编译系统忽略函数声明(原形)中的变量名。
全局变量 global variable
在函数之外定义的变量是外部变量,有效范围从定义变量的位置开始,到本源文件的结束。
同一个源文件中,如果全局变量和局部变量同名,则在局部变量的作用范围内,全局变量被屏蔽
作用域 scope
变量的有效范围称为变量的作用域,有四种不同的作用域:文件作用域(全局)file scope、函数作用域 function scope、块作用域 block scope 和函数原型作用域 function protorype scope

4.12 变量的存储类别

变量的四种属性
数据类型存储类别 auto,static,register,extern作用域存储期
其中,程序设计者只能声明变量的存储类别,通过存储类别可以确定变量的作用于和存储期
存储期
静态存储期和动态存储期,由变量的存储方法(静态存储方式和动态存储方式)决定。
存储空间
程序区,静态存储区(全局变量,程序开始执行时分配,执行完毕释放),动态存储区(形参和函数定义的变量,函数调用时的现场保护和返回地址)

自动变量

函数中的局部变量,如果不用关键字 static加以声明,编译系统对它们是动态地分配存储空间的,被称为自动变量auto variable

static 声明静态局部变量

指定函数中的局部变量为静态局部变量,则值在函数调用结束后不消失并保留原值,不释放存储单元,下一次调用函数时保留上一次调用结束时的值

register 声明寄存器变量

频繁使用的变量不存放在内存中,可存放在CPU的寄存器,存取速度高

extern 声明外部变量

static 声明静态外部变量

外部变量只限于被本文件引用

4.13 变量属性小结

从作用域分析

局部变量 自动变量,即动态局部变量(离开函数,值就消失)
局部变量(离开函数,值仍保留)
寄存器变量(离开函数,值就消失)
形式参数(可以定义为自动变量或寄存器变量)
全局变量 静态外部变量(只限本文件引用)
外部变量(即非静态的外部变量,允许其他文件引用)

从存储期分析

动态存储 自动变量(本函数内有效)
寄存器变量(本函数内有效)
形式参数
静态存储 静态局部变量(函数内有效)
静态外部变量(本文件内有效)
外部变量(可以被其他文件引用)

从存放位置来分析

内存中的静态存储区静态局部变量
静态外部变量
外部变量
内存中的动态存储区自动变量
形式参数
CPU中的寄存器寄存器变量

4.14 关于变量的声明和定义

定义性声明
需要建立存储空间的,int a;
简称定义
引用性声明
不需要建立存储空间的,extern int a;
称为声明

4.15 内部函数和外部函数

内部函数
本文件内,statice int func(int a,int b)
外部函数
可以供其他文件调用,extern int func(int a,int b)
可以省略 extern默认外部函数

4.16 头文件


Chapter5

5.1 为什么需要用数组

因为人家很好用啊。

5.2定义和引用一维数组

定义:

int a[2*5];
int a[10];
int a[n];//const int n=...

初始化:

int a[]={1,2,3};//定义时可以部分赋值,或全部赋值(此时可以不指定数组长度)

5.3 定义和引用二维数组

定义和初始化

int a[2][3]={{1,2},{3,4},{5,6}};
int a[2][3]{1,2,3,4,5,6};
int a[][3]={1,2,3,4,5,6};//全部赋值,第一维长度可省,第二维不可以省略
int a[2][3]={{1},{0,6}};//每行从第一列开始赋值,没有赋值自动置为0

5.4 数组作函数参数

数组名作实参和形参,传递的是数组的起始地址
1. 形参声明为数组名或指针变量,用来接收实参传递的地址;
2. 改变了形参数组的元素,将同时改变实参数组的元素

void select_sort(int a[10]);
void select_sort(int a[]);

5.5 字符数组

定义和初始化

char c[(10)]={'I',' ','a','m',' ','h','a','p','p','y'};

/*10可以省略,如果初值小于数组长度,则其余元素定位空字符'\0'*/

char str[]={"I am happy"};
char str[]="I am happy;//花括号可以省略,长度为11,最后面有系统加上的'\0'
char c[]={'I',' ','a','m',' ','h','a','p','p','y','\0'}

/*这三行代码等价,长度都为11,但不与第一行的代码等价*/
/*字符数组不要求最后一个字符必须为'\0'*/

输入输出

char str[20];
cin>>str;//"China"

/*此时数组str有6个字符,自动加了结束符'\0'*/

cout<<str;//"China",遇到结束符'\0'时停止输出,不输出'\0'

字符串处理函数

#include <string>
  1. 连接 strcat(char[],const char[])
  2. 复制 strcpy(char[],const char[]/const string)
  3. 比较 strcmp(const char[],const char[])
    (1)自左向右逐个字符比较ASCII码值,直到出现不同的字符或遇到 '\0'为止
    (2)等于,返回 0
    (3)大于,返回一正整数
    (4)小于,返回一负整数
  4. 长度 strlen :不包括 '\0'

5.6 C++处理字符串的方法——字符串类与字符变量


考试结束,施工完毕(烂尾) -2019.1.16

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注