第一章 绪论
1972年设计C语言是为了写UNIX操作系统的,吸收了其他语言的优点逐步成为实用性很强的语言
优点:语言本身简洁,使用灵活方便;既有高级语言的特点,又具有汇编语言的特点、可移植性好
缺点:语法结构不够严密,程序设计的自由度大,对数据类型的检查机制弱,缺少支持代码重用的结构,难以适应开发特大型程序
C++:引入运算符的重载、引用、虚函数等功能
高级语言编译过程:
尝试:输出hello world;输入输出变量
第二章 数据类型、运算符与表达式
常量与变量
常量:程序运行过程中保持不变的量,编译器根据表面形式判断类型
变量:在使用之前说明类型,在内存中占据与类型相应的存储单元
变量命名方法:
字母、数字、下划线,不大于247个字符,大小写不通用
关键字:c++语法中默认的一些字int之类的
(一般使用匈牙利命名法命名)
整型数据:
默认十进制、八进制0开头,十六进制0x开头
整形变量分为有符号型与无符号型,short,int,long分别为2、4个字节
整型常量有长短之分(l、L);没有unsigned型,但是一个非负的整型常量可以赋给unsigned型的变量
实型数据:
实型数又称浮点数,两种表示方法:十进制或指数型(23e1,e后必须是整数)
单精度float,双精度double;分别占4、8个字节
实数=尾数*基数^阶码
定点数、浮点数都会出现溢出现象,当超出机器所能表示的最大值是,运算停止。
字符型数据(char):
作为整形数据在内存中存储,8位存储一个字符,用ascii码形式存储
‘’内括起来的字符表示该字符的ASCII码
因为内存中形式与整型数据相同,所以可以直接用整型值给变量赋值
非打印字符:ASCII表示空格,回车13;转义字符\n \t \ddd \xhh \' \''
编译系统在见\时会接着找他后面的字符把他们处理成一个字符,在内存中占据一个字节
字符串常量 “”表示,在内存中顺序存放,以‘\0’结束(内存对应字符的ASCII形式)
标识符常量 #define、const
变量:在程序执行过程中值可以改变的量。编译程序要为它分配若干字节连续的内存单元,保证变量的取值。变量说明在前,使用在后。
算数运算符和算术表达式
算数运算符+-*/%
注意:两个整数相除结果为整数;整数才可以求余数,符号和左边数的符号相同
优先级和结合性:()*/%+-
强制类型转化
(double)a bmw=2002转化原则:根据左边变量类型进行转化。
(1)unsigned转化后多余字节补0 (2)多子节变量转化后扩展最高位为1,符号不变
自增自减(难)
++a 先运算后赋值/先赋值后运算 c++
(1)只能用于变量,不能用于常量和表达式【表达式在内存中没有具体空间,常量所占空间不能重新赋值】
(2)结合方式从右到左
关系比较 >=!
结果来看:真为1,假为0 条件来看:所有非0值均为真
逻辑运算
&& || !(优先级从小到大:逗号、赋值、逻辑、关系、算术、!)
逗号运算符
顺序求解,结果为最后一个表达式的值,且优先级最低 a=3*3,a+6,a+7; 16 a=9
各类数值型数据之间可以混合运算,前提要先转化成同一类型数据
第三章 简单的输入输出
输入 cin
C++所有输入输出都是通过输入输出流实现的
cin>>a>>b;输入语句会自动过滤空白字符,空格和回车是输入字符之间的分隔符
若要将每一个字符包括空格和回车赋给字符型变量时,使用cin.get()
若要输入16、8进制cin>>hex>>j; cin>>oct>>j; cin>>k;(仍为8进制,直到改变)
(1)只适用于整型变量
(2)所指明的数制保持有效,直到更新
(3)输入数据的格式个数类型要和定义变量一一对应。
输出cout
cout将双引号中字符串常量按照原样输出
若要指定输出项占用宽度:cout<<setw(6)<<i<<setw(10)<<j<<endl;
(1)包含在iomanip.h头文件中
(2)该设置仅仅对后面一个输出项有效
若想输出科学表示法:cout.setf(ios::scientific,ios::floatfield);//浮点数使用科学表示法输出
cout.setf(ios::fixed,ios::floatfield)//更新回到定点数表示形式
第四章 C++的流程控制语句
程序的三种基本结构:顺序、选择、循环
嵌套条件语句(难点)
条件运算符
三目运算符:max=a>b?a:b
(1)条件运算符的优先级比赋值运算高
(2)结合方向从左到右
(3)三个表达式类型可以不同
switch语句 进入相应case语句执行后,遇到case和default不再进行判断,直到switch语句结束。如果要使其在执行完相应的语句后中止执行下一语句,可以在句尾+break。
switch和if:switch只能判断是否等于,if可以计算各种表达式。case子句后必须为常量,常常是整型和字符型。default可以省略。case和default可以颠倒。多个case语句可以共用一组程序。
while语句:一定有一个循环变量 (难点)注意判断完后还会++--
dowhile语句:首先执行一次循环体,在判断表达式。所以当第一次循环表达式的值为真时,while和dowhile的结果完全一样,否则结果不相同。
for语句:用得太多了
循环的嵌套
最大公约数与最小公倍数——欧几里得算法、打印位数、级数求和、求素数、打印图形
break在循环体中可以从循环体内跳出循环体,提前结束循环(一层)。
continue:结束本次循环,跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。
第五章 函数与编译预处理
函数是c++的基本模块。所编写的函数应尽量少与主调函数发生联系,便于移植。
1、一个源程序文件是由一个或多个函数组成,编译程序以文件而非函数为单位进行编译
2、一个函数可以有多个源文件组成,可以分别编译统一执行
3、cpp从main函数开始执行
4、函数可以嵌套调用,不可以嵌套定义
库函数是c++编译系统已经预定义的函数。
函数参数和函数的值
形参:被调函数中的变量(必须定义类型)
实参:主调函数赋给被调函数的特定值(一定是定值)。
形式参数和实际参数类型相同,一一对应
内存使用:1、在未出现函数调用时,形参不占用内存存储单元,只有开始调用时候才会分配空间
2、实参和形参单向传递,在内存中占据不同单元
3、可以在别的函数中使用相同的形式参数变量名
函数只能有唯一返回值,且返回值必须是函数的类型;还可以终止函数,并将控制返回到主调函数
函数应当出现在主函数之前(先定义,后调用原则),也可以使用函数原型声明,用来说明函数的返回值和形参的类型。
函数的嵌套调用
函数可以嵌套调用但是不可以嵌套定义,可以递归调用
作用域和存储类
作用域是指程序中所说明的标识符在哪一个区间内有效,即哪一个区间内可以使用或引用该标识符
C++五类标识符:
块作用域
花括号内的。一个函数内部定义的变量或一个块中定义的变量称为局部变量(形参也是局部变量
不同的函数可以使用相同的名字的局部变量,在内存中属于不同存储区见互不干扰(main函数中定义的变量也只在main中有效,属于局部变量)定义变量就是在内存中开辟空间。
变量名相同,局部更优先
文件作用域
在函数外定义的变量称全局变量,其作用域称为文件作用域,在整个文件中都可以访问
当全局变量与局部变量同名时,局部变量优先
块作用域中可以通过作用域运算符::来引用与局部变量同名的全局变量
函数原型作用域
从说明处开始到函数原型说明结束为止。
可以在函数原型声明中省略参量名称float tt(int,float);
存储类
生存期:动态存储变量/静态存储变量
静态存储:文件运行期间有固定的存储空间,直到文件运行结束
动态存储:程序运行期间根据需要分配空间,函数结束后立即释放空间
局部变量分类
动态变量auto:默认存储在动态区
寄存器变量register:在cpu内部存储
静态局部变量:static:存储在静态区
动态局部变量未赋值时为随机值,作用域的函数或复合语句结束时空间被程序回收。
静态局部变量在静态区开辟存储空间,空间一直被保留直到程序运行结束,只能进行一次赋值。默认为0。
全局变量存储方式extern static
1、extern 全局变量more方式,当一个文件中要引用另一个文件中的全局变量或在全局变量定义之前要引用它时可以用extern说明,用来扩大全局变量的引用域。
2、static静态存储类别:仅能在本文件中饮用,即使其他地方用extern也不能引用。
当变量名相同导致作用域重合时,起作用的是最近说明的那个变量
内联函数
内联函数实质是用存储空间(使用更多存储空间)来换取更少的执行时间,在函数定义时在类型之前增加inline以使用。
注意:C++中除了循环switch分支复杂嵌套if外,所有函数都可以定义成inline
缺省函数
C++中定义函数时,允许给参数指定一个缺省的值。调用时若明确给出了这种实参的值则使用实参,否则使用缺省的值。使用时需注意:
1、不可以靠左边缺省
2、函数原型说明时可以不加变量名
3、只能在前面定义一次缺省值
参数个数可变的函数
调用头文件“stdarg.h”可以使用库函数va_start(),va_arg(),va_end
va_list类型变量,与int,float类同,是c++系统预定义的一个数据类型(非float),只有通过这种类型的变量次啊能从实际参数表中取得可变有参量。va_list ap;
va_start(ap,b) 初始化 b为可变参数前最后一个确定的参数
va_arg(ap,int) 依次取参数 int:可变参数的数据类型名
int temp; temp=va_arg(ap,int);
va_end(ap)正确结束
函数的重载
不同功能的函数可以具有相同的函数名,C++根据函数的实参来确定应该调用哪一个函数
1、定义重载函数必须有不同的参数个数or参数类型
2、仅返回值不同时,不能定义为重载函数
编译预处理
宏定义
不带参数的宏定义,用一个指定的标识符代表一个字符串,凡是遇上就用字符串替代
标识符称为宏名,编译前的替代过程称为“宏展开”
#define 标识符 字符串
他是一个简单的物理替换,不做语法检查,后面不加;
可以用#undef命令终止宏定义的作用域
带参数的宏定义
#define S(a,b) a*b
与函数调用的区别:1、机械替换 2、不用定义类型,作为字符串替代 3、宏调用执行时间稍快
#include包含文件后所有的源文件编译成一个可执行文件
条件编译
C语言允许有选择地对程序的某一部分进行编译,对一部分源程序制定编译条件。可以将部分源程序不转化为机器码。
形式1:#ifdef 标识符 程序段1 #else 程序段2 #end if 含义:若标识符已被定义过(#define),用程序段1进行编译,否则编译程序段2
形式2:#ifndef 标识符 程序段1 #else 程序段2 #endif 含义:与形式1相反,当标识符没有被定义过(用#define定义)则对1进行编译,否则编译2
形式3:#if 表达式 程序段1 #else 程序段2 #endif 含义:当表达式为真!0,编译程序段1,为0编译程序段2
采用条件编译后可以使机器代码程序缩短
程序的多文件组织
当一个完整程序被存放在多于一个文件中时,称为程序的多文件组织
内部函数和外部函数
内部函数仅限在本文件中调用,其他文件不能调用,用static定义该函数
外部函数可以被其他文件调用,用extern定义该函数。
第六章 数组
一维数组的定义和引用
数组是同一类型的一组值在内存中顺序存放。整个数组共用一个名字,其中每一项被称为一个元素
定义方式:
类型说明符 数组名【常量表达式】
1、序号从0开始 2、数组大小不能是变量 3、使用的时候其元素相当于变量
一维数组初始化
可以使用int a[]={0,1,2,3,4,5}编译器可以自动计算出内部的元素项数,并将数组定义为该长度
用局部static或全局定义的数组不赋值,系统默认是'\0'
static int a[10] 存储在静态数据区中的数组其元素默认为0