350 likes | 511 Views
第一章 C++ 语言概述. 内 容. 面向对象程序设计的基本思想 C++ 对面向对象程序设计的支持 C++ 的词法规则 C++ 程序的结构 C++ 程序的实现. 作 业 题. P20 三 (1). BeiJing ShangHai TianJing. P20 三 (2). Input a,b: 8 5 a=8, b=5 a-b=3. P20 三 (3). d=5; c=m. P21 四 (1). #include<iostream.h> void. main( ) {
E N D
第一章 C++语言概述 内 容 • 面向对象程序设计的基本思想 • C++对面向对象程序设计的支持 • C++的词法规则 • C++程序的结构 • C++程序的实现
作 业 题 • P20 三(1) BeiJing ShangHai TianJing • P20 三(2) Input a,b: 8 5 a=8, b=5 a-b=3 • P20 三(3) d=5; c=m
P21 四(1) #include<iostream.h> void main( ) { cout<<“This is a string!” ; } • 适当地包含一些文件; • 函数要说明类型,无返回值时,用void说明; • 语句以分号( ; )结束。
P21 四(2) #include<iostream.h> void main( ) { cin>>x; int p=x*x; cout<<“p=”<<p<<“\n”; } int x; • 变量必须先声明后使用; • cout输出字符串时用双引号(“”)括起;
P21 四(3) #include<iostream.h> void main( ) { int i, j; i=5; int k=i+j; cout<<“i+j=”<<k<<“\n”; } j=1; • 没有确定值的变量不能引用!
第二章 C++的数据类型和表达式 • 基本数据类型 • 常量和变量 • 数组类型 • 枚举类型 • 指针和引用 • 运算符 • 表达式 • 类型定义
§2.1基本数据类型 C++的基本数据类型—4种: 整型(int) 字符型(char) 浮点型/实型(单精度float 、双精度double) 空值型(void) 注:字符型有时统称为整型,在内存以ASCII形式存放。 基本数据类型的修饰符: 有符号(signed) 无符号(unsigned) 短型(short) 长型(long)
§2.2常量和变量 一、常量 1. 整型常量 a) 十进制整常量:无前缀, 由0~9组成; b) 八进制整常量:以0为前缀,由0~7组成,如0123等; c) 十六进制整常量:以0x或0X为前缀,由0~9和字母A~F(a~f)组成, 如0x7A, 0X8ef等; 注:用后缀L(或l)、U(或u) 分别表示长整型和无符号型。 2. 浮点型常量 由整数部分和小数部分组成,只有十进制表示 a) 小数表示法:如 3.6,5.,.22等; b) 科学表示法:如3e5、5.7e10、3.2E-5等; 注:用后缀F(或f)、L(或l)分别表示单精度型和长精度型。
3.字符常量 • 用单引号括起的一个字符; • 可打印字符通常用其符号表示:如‘A’, ‘*’, ’3’等; • 不可打印字符用转义序列法表示: \ddd:3位八进制数表示字符的ASCII码值 \xhh: 2位十六进制数表示字符的ASCII码值 4.字符串常量 • 由双引号括起的字符序列,以‘\0’作结束符; • 可包含空格符、转义字符等,用反斜线 \作续行符; • 字符串中的反斜线用 \\表示,双引号用 \”表示; 如:“Please enter \”Y\” or \”N\”: ” 解释为: Please enter “Y” or ”N”:
字符常量和字符串常量的区别: 1)定界符不同 字符常量用单引号括起,字符串常量用双引号括起; 2) 占内存空间大小不同 字符常量占1个字节, 字符串常量占多个字节;(比较:‘a’与 “a”) 3) 运算不同 字符常量能与整数进行加减运算,如:‘b’+1-’a’等; 字符串有自己的操作函数; 4) 存放形式不同 字符常量用一个字符型变量存放, 字符串常量用数组(字符指针)存放;
5. 符号常量 • C++中的常量通常用符号常量表示; • 定义符号常量方法 a) 使用类型说明符const 如:const int size=20;(定义时必须初始化) b) 宏定义命令法 如:#define PI 3.141526 二、变量 1. 变量名 • 遵循标识符规定,“见名知意”,一般用小写字母; 2. 变量类型 • 决定变量占用内存大小,并规定其合法操作;
3. 变量的值 • 存在两个有用值:数据值和内存地址值; 4. 变量的定义 • 必须先定义后使用; • 定义变量时要指出变量的类型和名字; 例: int length,width; float price=100.0; • C++允许随用随定义; • 注:变量除具有数据类型外,还有存储类别。
§2.3数组类型 一、数组的定义 由数目固定、类型相同的若干元素构成的有序集合,属构造数据类型; <类型> <数组名>[<大小>][<大小>]… int a[3]; (一维数组) char b[3][5]; (二维数组) float c[3][5][7]; (三维数组) 注:允许用符号常量指明数组大小,如: const int size=20; int m[size];
二、数组的赋值 1.数组元素的表示 • 用下标或指针表示,在内存中按下标升序连续存放; <数组名>[<下标表达式1>][<下标表达式2>]… 1)一维数组:int a[4]; a[0], a[1], a[2], a[3]. 2)二维数组:int b[2][3]; b[0][0], b[0][1], b[0][2], b[1][0], b[1][1], b[1][2]. 3)三维数组:int c[2][3][4]; c[0][0][0],c[0][0][1],c[0][0][2],c[0][0][3], c[0][1][0],c[0][1][1],c[0][1][2],c[0][1][3]…… c[1][2][0],c[1][2][1],c[1][2][2],c[1][2][3].
2. 数组元素的初始化 • 定义数组时,用初始值表为数组元素赋初值; 1) 一维数组 int a[4]={1,2,3,4}; 2) 二维数组 int b[2][2]={1,2,3,4}; 或 int b[2][2]={{1,2}, {3,4}}; • 初始化时数组元素个数>=初值表中数据项个数; 1) 一维数组: int a[4]={1, 2}; 故a[0]为1, a[1]为2, 其余默认0. 2)二维数组: int b[2][2]={1, 2}; 故b[0][0]为1, b[0][1]为2. int b[2][2]={{1},{2}}; 故b[0][0]为1, b[1][0]为2.
3. 数组元素赋值 例: int m[3]; m[0]=1;m[1]=2;m[2]=3; 4. 字符数组与字符串 • 可以使用字符串常量为字符数组赋初值; char s1[]={‘a’, ‘b’, ‘c’, ‘d’}; char s2[]=“abcd”; 注:char s2=“abcd”;(不合法) • 一维字符数组可以存放一个字符串; • 多维字符数组可以存放多个字符串; char ss[3][4]={“abc”, “rst”, “xyz”}; char ss[][4]={“abc”, “rst”, “xyz”};
§2.4枚举类型 “枚举”是若干有名字的整型常量的集合,属构造数据类型。 一、枚举模式 (enumerate列举) enum <枚举名> {<枚举表>}; 例:emum day {Sun, Mon, Tue, Wed, Thu, Fri, Sat}; 1)枚举表由若干枚举符组成,枚举符是整型常量 ; 2) 默认第一个枚举符值为0,后续依次加1; 3)允许枚举符定义时显式赋值,没有显式赋值的枚举符取默认值,后一个是前一个值加1; emum day {Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat};
二、枚举变量 enum <枚举名> <枚举变量名表>; 例: enum day d1, d2, d3; enum color{Red, Blue, Yellow, Black, White} c1, c2; 1) 枚举变量的值是枚举表中的一个枚举符; 2) 用枚举符为枚举变量赋值; 例:d1=Sun; d2=Sat; c1=Red; c2=Blue; 3) 不能将一个整型数值直接赋给枚举变量; 例: c2=3;(不合法)c2=(enum color)3;(合法) 4) 枚举变量的输出值总是整型数值;
§2.5指针和引用 一、指针 1. 指针的定义 <类型> * <指针名>; 例: char *pc; float *pf; int *pa, *pb; • 指针是一种特殊的变量, 用来存放内存地址; • 指针的类型是它指向的变量的类型; 2. 指针的赋值 • 指针只有赋值后才能引用! • 只能用地址值为指针变量赋值!
内存 地址 a 1000H pa 3000H 5 1000H 1) 变量地址赋给指针 例:int a=5, *pa=0; pa=&a; 2) 数组首地址赋给指针 例: int b[5], *pb=b; 3) 函数入口地址赋给指针 例: double sin(double x); double(*pf)( )=sin; 4) 同类型指针间赋值 例: int a, *p=0, *pa=&a ; p=pa;
3.指针的运算 1) 赋值运算; 2) 加、减整数运算; 3) 一定条件下,两指针相减; 如:指向同一数组不同元素的两个指针相减的差是这两个指针间相隔元素的个数 4) 一定条件下,两指针比较;
二、指针和数组 • 数组名是一个常量指针,是数组首元素的地址; • 数组元素可用下标法表示或指针法表示; 1.一维数组 设: int a[5]; a[i] <=> *(a+i)其中 i=0,1,2,3,4. 2.二维数组 设: int b[2][3]; b[i][j] <=> *(*(b+i) +j) b[i][j] <=> (*(b+i))[j] b[i][j] <=> *(b[i]+j)其中 i=0,1; j=0,1,2.
三、引用 定义格式: <类型> & <引用名> (<变量名>) ; <类型> & <引用名> = <变量名>; 例: int a=3; int &m(a); (main中错)或int &m=a; int &d=120; 即 int temp=120; int &d=temp; • 引用是变量的别名,本身不占内存单元;(占指针大小) • 定义时必须初始化, 初始化后不能改变; • 对引用的操作就是对被引用变量的操作; • 引用的地址值就是被引用变量的地址值; • C++中常用作函数参数或函数返回值;
比较 例2.5 分析程序输出结果 #include<iostream.h> void main( ) { int val(5); int &refv=val; //int &refv(val) 错 //引用定义时初始化 refv=refv+5; //对引用操作 cout<<val<<endl; int*p=&refv,val1(refv); //取引用的地址值 cout<<*p<<‘\t’<<val1<<endl; } “指针”通过地址间接访问某个变量; “引用”通过别名直接访问某个变量; val=5 val1=refv
§2.6运算符 一、算术运算符 1)单目: -(负)、+(正)、++、-- 2)双目: +、-、*、/、% 注:++(自增)、--(自减)分前后缀两种方式,有副作用 ++i, --i i 的值先加(减)1, 再参与其他运算 i++, i-- i 参与其他运算之后,i的值再加(减)1 二、关系运算符 >、<、>=、<=、==、!= 三、逻辑运算符 1)单目: !(逻辑反) 2)双目: &&(逻辑与)、||(逻辑或) 注:关系、逻辑运算符组成的表达式是逻辑值, 真为1, 假为0.
四、位操作运算符 1. 逻辑位运算符 1)单目: ~(按位求反) 2)双目: &(按位与)、|(按位或)、^(按位异或) 2. 移位运算符 <<(左移)、>>(右移) 注:位运算符对二进制数操作,操作数都是int型。 五、赋值运算符 =、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>= 如:int a(5); a*=3; a=a*3;
六、其他 1. 三目运算符(唯一) ?: 2. 逗号运算符 3. sizeof运算符 返回其后的类型说明符或表达式表示的数在内存中所占字节数 如:int a[10]; sizeof(a)/sizeof(int); 4. 强制类型运算符 将表达式的值强制为所指定的类型, 一次性的, 不安全的. 如:int a; double b=3.8921; a=int(b)+(int)b; 5. 取地址运算符 & 如:int a, b, *pa=&a; 6. 取内容运算符 * *pa=10;b=*pa;
七、运算符的优先级和结合性 • 用于确定运算符在表达式中的计算顺序 1.优先级(15种) “去掉一个最高的元素/成员,去掉一个最低的逗号,余下为一、二、三、赋值” “双目分为算术、关系和逻辑,移位、逻辑位插其中” 2.结合性 大多从左至右,只有单目、三目和赋值运算符从右至左 [详见P46表2.3]
§2.7表达式 一、表达式的种类 1.算术表达式 • 结果为数值,类型与操作数中类型最高的一致 2.关系表达式 • 值为逻辑类型,用1表示真,0表示假 3.逻辑表达式 • 值为逻辑类型,1表示真,0表示假; • C++只对能够确定整个表达式值所需的最少数目的操作数进行计算; 如: int a(3), b(0); !a&&a+b&&a++ (只计算!a) a||b||b++ (只计算a)
[例2.9] #include <iostream.h> void main( ) { int x, y, z; x=y=z=1; --x&&++y&&++z; cout<<x<<‘\t’<<y<<‘\t’<<z<<‘\n’; ++x&&++y&&++z; cout<<x<<‘\t’<<y<<‘\t’<<z<<‘\n’; ++x&&y--||++z; cout<<x<<‘\t’<<y<<‘\t’<<z<<‘\n’; } 0 1 1 1 2 2 2 1 2
[例2.10] • #include<iostream.h> • void main( ) • { • int a(3), b(4), c; • c= a>b? ++a : ++b; • cout<<a<<“,”<<b<<“,”<<c<<endl; • c= a-b? a+b : a-3?b:a ; • cout<<a<<“,”<<b<<“,”<<c<<endl; • } 4.条件表达式 d1? d2 : d3 • d1为真时,表达式的值为d2的值,否则为d3的值; • 表达式的类型与d2,d3中最高操作数类型一致; 3,5,5 结合性从右至左 3,5,8
5.赋值表达式 • 表达式的类型取决于左值类型; 如:int a(3),b(4); a*=b+1; 相当于a*=(b+1); 6.逗号表达式 • 从左至右逐个表达式计算; • 最终表达式的值和类型取决于最后一个表达式的值和类型
二、表达式中的类型转换 1.隐含转换 • 操作数类型不一致时,由低类型向高类型转换; • 属保值转换,数据精度不受损; 2.强制转换 1)显式强制转换 --通过强制转换运算符实现,是不安全的、暂时性的转换 2)隐式强制转换 --赋值表达式中,右值类型强制转换为左值类型; --函数调用中,函数返回值类型强制转换为函数类型; int—>unsigned—>long —>unsigned long —>double short,char float
§2.8类型定义 • C++允许自定义类型,为已有类型起别名; • typedef <已有类型名> <新类型名表> ; 例: typedef doublewages, bonus; wages weekly; bonus monthly; • 新类型名可以出现在标准类型名所能出现的任何位置; • 作用: 改善程序可读性、书写简洁、提高可移植性
类型表达式可由数据类型名与类型修饰符构成 • 类型修饰符包括:[ ]、( )、 *和 & 指针 引用 下标 函数 例:复杂的类型说明 ps: char* typedef char * ps; typedef int * array[10]; typedef int * f(double); array: int*[10] f: int*(double) • 规定类型表达式的优先级: [ ]和( )最高,*和&其次,数据类型名最低。