@Moritz
2019-01-16T05:49:37.000000Z
字数 7753
阅读 576
课程学习
C++
所有文稿
谭浩强
主要用于准备C++的笔试期末考,内容涵盖第一章到第五章
<<
是 插入运算符
,与 cout
配合使用,将右侧插入到输出队列cout(输出流)中,C++系统将输出流cout的内容输出到系统制定的设备(一般为显示器)中
标准C++要求main函数必须声明为 int
型,如果程序正常执行,则向操作系统返回数值0,否则返回数值-1.但并非所有C++编译系统都完全执行C++这一规定。
头文件 header file
C++标准库的类和函数在命名空间std中声明,使用命名空间 using namespace std;
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) |
signed
,则数值以补码形式存放,存储单元中最高位(bit)用来表示数值符号;指定为 unsigned
则全部二进制位都用来表示数值。float
提供6位有效数字,double
提供15位有效数字,并且数值范围不同;GCC则对long double
分配12B。派生类型 | 指针类型(*) |
---|---|
枚举类型(enum) | |
数组类型([]) | |
结构体类型(struct) | |
共用体类型(union) | |
类类型(class) | |
空类型(void) |
L
,123L,0L。用于函数调用,若形参为long int则用123L做实参0
0X
F
或 f
,123F,-43f,单精度; 加 L
或 l
,123L,123l,长双精度'\0'
作为字符串结束标志,不算做字符串的一部分,多占一个字节"a"
字符串常量,占两个字节;'a'
字符常量,占1个字节 #define PRICE 30;
在编译预处理时,所有的PRICE
都被替换为字符 30 ,正式进行编译时已经没有PRICE
这个标识符。
符号常量不能被赋值,如下列语句则是错误的:
#define PRICE=40;
(由高到低)
单目运算符,非( + , - , ++ , -- , ! ) |
---|
乘、除、求余运算符( * , / , % ) |
加减运算( + , - ) |
关系运算( < , <= , > , >= ) |
关系运算( == , != ) |
逻辑与运算( && ) |
逻辑或运算( || ) |
条件运算( ? ) |
赋值运算( = ) |
逗号运算( , ) |
float
型时,C++在运算时对所有float
型数据都安double
型处理,所以运算结果为double
型<高>
double ← float
↑
long
↑
unsigned
↑
int ← char,short
<低>
int i=3;j=...
代码 | 运算过程 | 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
%
,若两侧有非整形量时需要转换类型(int)(x+y)%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的值),括号不可省略 |
例子
a=3*5,a*4;//先求解a=3*5=15,再将a*4=60的值赋给a
程序 = 算法 + 数据结构
计算机算法可分为两大类别:数值算法和非数值算法
statement
,分为四种 ;
可以用于循环体{}
赋值号 =
是一个赋值运算符,可以下称一下两行等价代码
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;//错误,不是语句,不加';'
C和C++本身都没有为输入和输出提供专门的语句结构。在C语言中,输入输出的功能是通过调用scanf
和printf
函数实现的,C++中是通过调用输入输出流库中的流对象cin
和cout
实现的。
stream
cout
是输出流对象的名字,cin
是输入流对象的名字。
<<
(也称流插入操作符)>>
有关流对象cin
、cout
和流运算符的定义等信息是存放在C++的输入输出流库中的,b不是C++本身提供的语句,需要使用预处理指令吧头文件stream
包含到本文件中。
#include <iostream>
定义流对象时,系统会在内存开辟一段缓冲区,用来暂存输入输出流的数据。
在执行cout
语句时,并不是插入一个数据就马上输出一个数据,而是先把插入的数据顺序存放在输出缓冲区中,直到缓冲区满或遇到cout
语句中的endl
、'\n'
、ends
或flush
为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。
<iomanip>
getchar
和 putchar
c=getchar();//输入'A'
putchar(c+32);//输出'a',ACSII码值是'A'+32
putchar('\n');
scanf
和 printf
scanf("%d%c%f",&a,&c,&b);//注意变量名前加地址运算符&,
printf("a=%d,b=%f,c=%c\n",a,b,c);//
优先级相同(高) | < |
---|---|
<= | |
>= | |
> | |
优先级相同(低) | == |
!= |
bool
在内存中占1B
编译系统处理逻辑型数据时,将flase
处理为0
,将true
处理为1
。
bool flag=ture;
cout<<flag;//输出 1
将一个非零整数赋给逻辑性变量,则按true
处理。
&&
||
!
&&
和||
是双目运算符 !
是一目运算符 !
→算术运算符→关系运算符→&&
和||
→赋值运算符if
语句{}
括起来的复合语句中可以定义变量。else
与它上面最近的、且未配对的if
配对?:
和条件表达式例子
max=(a>b)?a:b;
switch
语句case
和default
出现次序不影响执行结果case
子句中若没有break;
语句,则从此开始执行下去(包括default
语句),不再进行判断while
do-while
do
{sum=sum+i;
i++;
}while (i<=100)
for
break
和continue
提前结束循环for
语句中使用continue
function
void
也可以不写类型名 函数名([void]/[形参表列])
{声明部分
执行语句
}
函数名([实参列表])
即为提高存在频繁使用的函数的程序的效率,在编译时将所调用函数的代码直接嵌入到主函数中,而不是将流程转出去,这种函数叫内置函数 inline function
inline int max(int a,int b){...}//定义和声明时,在左端加上inline
编译系统遇到函数调用 max(i,j)
时,就用 max
的函数体代替 max(i,j)
,同时实参替代形参。节省运行时间,但增加目标程序的长度。内置函数中不能包括复杂的控制语句,例如循环语句和 switch
语句。
下面一个为几个函数定义
int max(int a,int b){}
double max(double a,double b){}
long max(long a,long b){}
函数名 max
分别定义了三个函数,声明也要声明三次!!,系统会根据调用函数时给出的信息去找与之匹配的函数。
重载函数的参数顺序、函数体和参数个数可以不同(至少有一种不同),声明时每种都要声明一次。
local variable
main
函数。可以使用同名变量。形参是局部变量,编译系统忽略函数声明(原形)中的变量名。global variable
scope
file scope
、函数作用域 function scope
、块作用域 block scope
和函数原型作用域 function protorype scope
。auto,static,register,extern
,作用域,存储期。 函数中的局部变量,如果不用关键字
static
加以声明,编译系统对它们是动态地分配存储空间的,被称为自动变量auto variable
static
声明静态局部变量指定函数中的局部变量为静态局部变量,则值在函数调用结束后不消失并保留原值,不释放存储单元,下一次调用函数时保留上一次调用结束时的值
0
或 '\0'
(不对自动变量自动赋初值)register
声明寄存器变量频繁使用的变量不存放在内存中,可存放在CPU的寄存器,存取速度高
extern
声明外部变量静态存储区
static
声明静态外部变量外部变量只限于被本文件引用
局部变量 | 自动变量,即动态局部变量(离开函数,值就消失) |
---|---|
局部变量(离开函数,值仍保留) | |
寄存器变量(离开函数,值就消失) | |
形式参数(可以定义为自动变量或寄存器变量) | |
全局变量 | 静态外部变量(只限本文件引用) |
外部变量(即非静态的外部变量,允许其他文件引用) |
动态存储 | 自动变量(本函数内有效) |
---|---|
寄存器变量(本函数内有效) | |
形式参数 | |
静态存储 | 静态局部变量(函数内有效) |
静态外部变量(本文件内有效) | |
外部变量(可以被其他文件引用) |
内存中的静态存储区 | 静态局部变量 |
---|---|
静态外部变量 | |
外部变量 | |
内存中的动态存储区 | 自动变量 |
形式参数 | |
CPU中的寄存器 | 寄存器变量 |
int a;
extern int a;
statice int func(int a,int b)
extern int func(int a,int b)
extern
,默认外部函数因为人家很好用啊。
定义:
int a[2*5];
int a[10];
int a[n];//const int n=...
初始化:
int a[]={1,2,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
数组名作实参和形参,传递的是数组的起始地址
1. 形参声明为数组名或指针变量,用来接收实参传递的地址;
2. 改变了形参数组的元素,将同时改变实参数组的元素
void select_sort(int a[10]);
void select_sort(int a[]);
定义和初始化
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>
strcat(char[],const char[])
strcpy(char[],const char[]/const string)
strcmp(const char[],const char[])
'\0'
为止 0
strlen
:不包括 '\0'
'\0'
考试结束,施工完毕(烂尾) -2019.1.16