版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第3章 C+基本语法 第1页主要内容13.1 数据类型 23.2 常量和变量 33.3 运算符和表示式43.4 语句 53.5 小结第2页3.1 数据类型程序中各种加工和处理都是针对一些数据进行,这些数据由数据类型描述。数据类型要求了数据存放结构(在内存中占据大小和布局)、能够进行运算、取值范围。C+中数据类型大致分为三类:C+预定义一组内置基本数据类型,表示常见简单数据,如整数、浮点数等;复合类型,由基本数据类型组合而成更复杂数据类型,如数组、结构体、联合、枚举等;类类型,即用户自己定义抽象数据类型。为了方便程序员,C+标准库中还提供一些惯用抽象数据类型。2常量和变量3运算符和表示式4语句5
2、小结数据类型1第3页3.1.1 内置数据类型字符类型字符型char,通惯用来表示单个字符和小整数。整数类型整型int、短整型short、长整型long,分别代表不一样长度整数值char、short、int和long类型都能够用signed和unsigned修饰浮点类型浮点型float、双精度浮点型double和长双精度long double布尔类型bool类型只有两个值:true和false。-bool类型、char类型、各种整数类型通称为整值类型。整值类型和浮点类型一起被称为算术类型。2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚
3、举 类类型第4页内置数据类型空间大小 标准C+对内置数据类型空间大小并没有做出严格要求, 但为了编写可移植代码,应该了解你所使用编译器和机器,防止对这些特征做出某种假定。 以下代码能够测试C+编译器为每种数据类型分配空间大小: 2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型#include using namespace std;int main( )cout sizeof(char) endl; cout sizeof(int) endl;cout sizeof(float) endl;cout sizeof(doubl
4、e) endl;cout sizeof(bool) endl; return 0;Visual C+ 6.0和DEV-C+结果:14481第5页3.1.2 指针类型 指针持有一个对象地址,经过指针能够间接操作这个对象。指针经典使用方法:构建链式数据结构,如链表和树管理程序执行时动态分配对象作为函数参数每个指针都有相关类型,需要在定义指针时指出。不一样类型指针表示方法和保留地址值并没有分别,区分只是在于指针指向对象类型不一样。指针类型指出了怎样解释该内存地址保留内容,以及该内存区域应该有多大。比如: int *pi; /指向整型指针,如指向内存地址是1000,则跨越地址空间是10001003 c
5、har *pc;/指向字符型指针,如指向内存地址是1000,则只占据1000这个字节区域2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第6页空指针指针值为0时表示它不指向任何对象,即空指针。指针不能保留非地址值,也不能被赋值或初始化为不一样类型地址值。2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型int ival = 100;int *pi = &ival; / pi 被初始化为ival地址int *pi2 = 0; /pi2不指向任何对象pi2 =
6、ival;/编译错误double dval = 1.5;pi = &dval;/编译错误第7页通用指针C+提供了一个通用指针,即void*指针,它能够持有任何类型地址值。不能操纵void指针指向对象,只能传送该地址值或和其它地址进行比较。C+也不允许void指针到其它类型指针直接赋值。2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型int a = 10;char ch = k;void* pv = &a;/OKpv = &ch;/OKint* pi = pv;/错误,应该使用pi = (int*) pv经过解引用操作(*)能
7、够间接访问指针指向对象。int x = 100, y = 20;int *pi = &x;*pi = y;/ x = y第8页指针算术运算指针能够进行加或减整数值算术运算,这时地址值增加数目取决于指针类型。指针只有在指向数组元素时,其算术运算才有意义。2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型int a = 10;char ch = k;int* pi = &a;char* pc = &ch;pi+; /在原地址值上加4;因为int占4个字节pc+; /在原地址值上加1;因为char占1个字节第9页3.1.3 引用类型
8、引用又称为别名,它能够作为对象另一个名字。经过引用我们能够间接操纵对象,使用方式类似于指针,不过不需要指针语法。在程序中,引用主要用作函数形参。引用由类型标识符和一个取地址符(&)来定义,引用必须被初始化。2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型int ival = 100;/OK,refVal是指向ival引用int &refVal = ival; /Error,引用没有初始化int &refVal2; /Error,不能用对象地址来初始化引用int &refVal3 = &ival; int &refVal4 =
9、 10; /Error,不能用没有内存地址数值来初始化引用第10页引用注意事项(1)引用一旦定义,就不能再指向其它对象,对引用全部操作都会被应用在它所指向对象上。比如: int x = 100, y = 20; int &r = x;/ r是x引用 r = y;/r不是y引用,而是x = y2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第11页引用注意事项(2)注意引用初始化和赋值极为不一样:初始化时引用“指向”一个对象,赋值时,引用被作为所指对象别名。虽然C+标准没有要求引用实现方式,不过在很多C+编译器中,引用被实现为
10、与所指对象占据同一地址空间,比如下面代码:#include using namespace std;int main() int a = 10; int& ra = a; couta=at&a=&aendl; coutra=rat&ra=&raendl; ra = 20; couta=at&a=&aendl; coutra=rat&ra=&raendl;在GNU C+编译环境输出结果以下: a=10&a=0 x22ff34ra=10&ra=0 x22ff34a=20&a=0 x22ff34ra=20&ra=0 x22ff342常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针
11、类型 引用类型 数组 结构体 联合 枚举 类类型第12页引用与指针差异(1)定义与初始化指针定义形式:类型 *指针变量;指针初始化:int x = 10, y = 20;int *pi; /能够不初始化pi = &x; /p 指向int 类型对象xpi = &y; /p 也能够重新指向y引用定义形式:类型 &引用名 = 初始值;引用初始化:定义引用时必须用有内存地址对象初始化。引用在初始化之后,一直指向该对象。比如:int a = 10, b=20;int &ri = a; /必须初始化ri = b; /等同于a=b;2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型
12、引用类型 数组 结构体 联合 枚举 类类型第13页引用与指针差异(2)使用方式指针经过解引用(*)运算间接访问指向对象;引用作为对象别名,能够直接访问对象。比如:pi = &x;*pi = 30; / x=30int &ri = a;ri = 40; /a=402常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第14页引用与指针差异(3)指针能够不指向任何对象,引用必须指向一个对象。pi = 0; /pi是空指针,不指向任何对象ri = 0; / a=02常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型
13、 引用类型 数组 结构体 联合 枚举 类类型第15页引用与指针差异(4)指针之间相互赋值会改变指向关系;引用之间相互赋值是它们指向对象之间赋值,引用关系本身并不改变。int x = 100, y = 20;int *p1 = &x, *p2 = &y;p1 = p2; / p1=&y, p1 和p2 都指向yint &r1 = x, &r2 = y;r1 = r2; / x y, r1 仍是x 引用2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第16页3.1.4 数组数组是一个单一数据类型对象集合。其中单个对象没有命名,但
14、能够经过它在数组中位置进行访问,即下标访问。比如: /ia是包含10个int对象数组 int ia10; /数组中下标为3元素被赋值为7 ia3 = 7; 2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第17页定义数组定义数组时需要指定类型名、数组名标识符和数组大小。数组大小是一个大于1常量表示式。数组元素下标从0开始,到数组大小1。不过,C+并不提供对数组下标范围检验,需要程序员自己确保正确性。定义数组同时能够对数组进行初始化,初始值放在花括号中,用逗号隔开。 int ia3 = 1, 2, 3; int ib = 4,
15、 5, 6, 7; int ic10 = 0, 1, 2;2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第18页数组注意事项一个数组不能被另一个数组初始化,也不能被直接赋值给另一数组。C+也不允许申明一个引用数组,比如: int ia3=1,2,3; int ib=ia; /!Error int &ria=ia; /!Error int ival1=0,ival2=1; int &r2=a,b; /!Error int &rv1=ival1,&rv2=ival2; int rv2=rv1,rv2; /OK2常量和变量3运算
16、符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第19页C格调字符串C+保留了C语言中用字符数组表示字符串方式,称为C格调字符串。能够经过库函数对这么字符串进行操作。需要包含标准库头文件2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第20页多维数组定义多维数组,每一维大小由一对方括号指定。比如: int ia43; 访问多维数组元素要指定每一维下标。比如: ia12 = 5;多维数组也能够被初始化: int ia32 = 0, 1, 2, 3, 4, 5 ;2常量和变量3
17、运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第21页数组与指针数组名字代表数组第一个元素地址,它类型是数组元素类型指针。比如对下面数组定义: int ia5;ia是一个int*类型, ia和&ia0都表示第一个元素地址。因而,除了使用下标访问数组元素之外,还能够使用指针对数组进行访问。 int main() int a10; int i; int *p; for(i = 0; i 10; i+) ai = i; for(p = a; p a+10; p+) cout”运算符选择。定义结构体类型之后,能够创建该类型许多实例。比如:2常量
18、和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型struct X char c;int i;float f;double d;X s1, s2;X* ps = &s1;s1.c = a;s1.i = 1;s1.f = 3.5;s1.d = 0.7s2.c = ps-c;第23页结构体变量内存中大小(1)结构体变量组员在内存中依次存放,因而,标准上,结构体变量在内存中大小是其全部组员大小之和。不过,为了提升访问效率,大多数编译器实际上都使用了边界对齐技术。 struct Y char c; int i; ; Y st; 上面变量st
19、在内存中占据几个字节呢?是5吗? 2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第24页结构体变量内存中大小(2)内存地址1000开始一个机器字内存地址1004开始一个机器字内存地址1008开始 st.c占一个字节st.i占一个完整机器字为了边界对齐而空出来3个字节st占8个字节2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型在GCC编译器下,sizeof(Y)结果是8。第25页3.1.6 联合(共用体)union和struct语法类似,只是数据组员存放
20、方式不一样。union每个组员都是从联合变量首地址开始存放,所以每次只能使用一个组员。使用union能够节约空间,不过轻易犯错。 union Packed char c; int i; float f; double d; ; /联合大小是其中double大小 /因为double是占据空间最大元素 Packed x; x.c = a;/其余组员现在不可使用 x.d = 3.14;/覆盖了组员c内容2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第26页联合内存布局2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类
21、型 指针类型 引用类型 数组 结构体 联合 枚举 类类型x.dx首地址x.cx.fx.i第27页3.1.7 枚举枚举定义了一组命名整数常量,从而提升代码可读性。比如: enum ShapeType circle, square, rectangle ;ShapeType枚举类型定义了3个常量:0,1,2 分别和名字circle,square以及rectangle关联。ShapeType是一个枚举类型,能够用它来定义枚举变量,变量值只能是枚举组员。也能够自己指定枚举组员值: enum ShapeTypecircle10, square20, rectangle;未指定值枚举组员,编译器会赋给它相
22、邻下一个整数值,所以rectangle组员值是21。枚举类型在必要时,如参加算术运算,会被自动提升为算术类型。枚举组员名字是不可打印,输出是它所表示整数值。另外,不能使用枚举组员进行迭代,C+不支持枚举组员之间前后移动。2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第28页3.1.8 类类型除了内置类型和复合类型之外,C+还允许用户自己定义类类型,而且在标准库中预定义了一些惯用类型。这里先简单介绍几个惯用标准类型。 输入输出流iostream 字符串类 标准数组向量类 2常量和变量3运算符和表示式4语句5小结数据类型1 内
23、置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第29页输入输出流iostream输入输出操作是由iostream类提供,使用iostream需包含标准库头文件: #include iostream库中有两个预定义对象:cin,istream类型对象,用于从用户终端读入数据。cin惯用方式为:cin 变量名; cin 变量名1 变量名2; cin 变量名1 变量名2 变量名n;cout,ostream类型对象,用于向用户终端写数据。cout 惯用方式为:cout 表示式; cout 表示式 endl; cout 表示式1 表示式2 表示式n; 2常量和变量3运算符和表示式4语句
24、5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第30页输入输出流iostream#include using namespace std;int main()int ival;float fval;cin ival;cin fval;cout ival n;cout fval ival fval;cout ival n fval endl;2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第31页字符串类string除了保留C格调字符串char*之外,C+标准库还定义了字符串类string
25、。string类支持字符串对象各种初始化方式,支持字符串之间拷贝、比较和连接等操作,还支持对字符串长度查询和是否为空判断,而且也能够访问字符串中单个字符。使用string类,需要包含对应头文件:string。#include 2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第32页字符串类string#include #include using namespace std;int main() string s1, s2;/创建两个空字符串对象 string s3 = Hello, World!; /初始化s3 strin
26、g s4(I am ); s2 = “Today”;/赋值 s1 = s3 + + s4; /字符串连接 s1 += 5 ;/末尾追加 cout s1 + s2 + ! endl; /输出字符串内容 cout Length of s1 is : s1.size() endl; /输出字符串长度 for (int i = 0; I s1.size(); +i) cout s1i ; /逐一输出s1中字符2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第33页字符串类string字符串比较使用运算符“=”取得字符串长度使用siz
27、e()判断字符串是否为空使用empty()能够将一个C格调字符串赋给string对象,但反之不可。要将string对象转换为C格调字符串,使用c_str()操作,其返回结果为const char*,即转换得到C格调字符串首地址。比如:string s1 = “This is a book.”;int x = strlen(s1);/Errorx = strlen(s1.c_str();/OK2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第34页标准数组向量类C+标准库中vector类为内置数组类提供了一个替换表示。为了使用
28、vector,我们必须包含相关头文件:vector。vector能够像数组一样使用,还能够以STL方式使用。/数组习惯#include using namespace std;int main() vector iv(10); int ia10; for(int id = 0; id10; id+) iaid = ivid; /2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第35页向量类:STL使用习惯/STL习惯#include #include using namespace std;int main() vector
29、 iv; for(int id = 0; id10; id+) iv.push_back(id); for(int id = 0; idiv.size(); id+) coutivid; /2常量和变量3运算符和表示式4语句5小结数据类型1 内置数据类型 指针类型 引用类型 数组 结构体 联合 枚举 类类型第36页3.2.1 内置数据类型文字常量 当一个数值,比如5,出现在程序中时,它被称为文字常量(literal constant)。“文字”是因为只能以它值形式指代它。“常量”是因为它值不能被改变。文字常量是不可寻址。每个文字常量都有对应类型,其类型由其形式、取值和后缀决定。3运算符和表示式
30、4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const限定词 volatile限定词第37页整数文字常量 整数文字常量能够表示为十进制、八进制或十六进制形式。比如23能够写成: 23 /十进制 027 /八进制 0 x17 /十六进制十进制整数文字常量默认类型是int,假如数值超出int能够表示范围,那么其类型是long。八进制和十六进制整数文字常量类型是int、unsigned int、long、unsigned long中第一个范围足够表示该数值类型。能够在文字常量后面加“L”或“l”后缀将其指定为long类型。能够加“U”或“u”将其指定为无符号数。如:116u 120U
31、L 2L3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const限定词 volatile限定词第38页浮点型文字常量浮点型文字常量能够写成普通十进制形式或科学计数法形式。比如浮点数235.8能够表示为:235.8 2.358E2 浮点型文字常量默认为double类型,也能够加后缀改变其类型。float类型浮点文字常量能够在后面加“F”或“f”标示,后缀“L”或“l”则为long double类型。 3.14F 1.24f 2.5E3L3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const限定词 volatile限定词第39页布尔型文
32、字常量bool型文字常量只有true和false。3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const限定词 volatile限定词第40页字符型文字常量字符型文字常量是用单引号括起来单个字符或以斜线开头转义字符,如a,n。一些惯用转义字符如: 转义字符含义转义字符含义n换行符r回车键b退格键a响铃符t水平制表键v垂直制表键反斜杠键?问号键单引号键双引号键ooo八进制数ooohhh十六进制数hhh3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const限定词 volatile限定词第41页字符串文字常量在程序中经常出现还有用双引号
33、括起来字符序列,即字符串文字常量,比如hello world,其默认类型是const char*。 3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const限定词 volatile限定词第42页3.2.2 变量和标识符变量变量为我们提供了一个有名字存放区,能够经过代码对其进行读、写处理。变量有时也被称为对象。每个变量都有特定数据类型,这个类型决定了相关内存大小、布局、能够存放在该存放区值范围以及能够应用在其上操作。比如: int count; double salary; 3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const限定词
34、 volatile限定词第43页3.2.2 变量和标识符标识符引用变量要经过其名字,而变量由标识符命名。标识符能够由字母、数字以及下划线组成,但必须由字母或下划线开头,而且区分大小写字母。上面代码中count和salary都是标识符。C+保留了一些词用作关键字,关键字不能作为程序标识符使用。3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const限定词 volatile限定词第44页C+关键字asmautoboolbreakcasecatchcharclassconstconst_castcontinuedefaultdeletedodoubledynamic_c
35、astelseenumexplicitexportexternfalsefloatforfriendgotoifinlineintlongmutablenamespacenewoperatorprivateprotectedpublicregisterreinterpret_castreturnshortsignedsizeofstaticstatic_caststructswitchtemplatethisthrowtruetrytypedeftypeidtypenameunionunsignedusingvirtualvoidvolatilewchar_twhile第45页变量命名规则(1
36、)变量名字要完全、准确地描述出该变量所代表事物。变量名不能过短太短名字无法传达足够信息,也不能过长太长名字极难写且不实用。研究表明,变量名最正确长度是9到15个字符。使用i、j、k这些名字作为循环变量是约定俗成,但不要在其它场所使用。给布尔变量赋予隐含“真/假”含义名字,如done,error,found,success或ok等。3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const限定词 volatile限定词第46页变量命名规则(2)常量、typedef和预处理宏全部大写;类和其它类型名字混合大小写;变量名和函数名中第一个单词小写,后续每个单词首字母大写,如
37、variableOrRoutineName。除了在特定前缀中,不要用下划线作为名字中分隔符,如student_name,用studentName更加好。应该防止使用这些名字:令人误解名字或缩写,含有相同含义名字,带有数字名字,拼写错误单词,仅靠大小写区分名字,混用各种自然语言(如汉语拼音和英语),标准类型和函数名字。防止在名字中包含易混同字符:比如,数字一(1)、小写字母L(l)和大写字母i(I),数字0和大小写字母O(o),数字2和字母z。3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const限定词 volatile限定词第47页变量右值和左值变量和文字常量区
38、分在于变量是可寻址,对于每个变量,都有两个值与之关联:它数据值,存放在某个内存地址中。有时也被称为右值。文字常量和变量都能够被用作右值。它地址值,即存放数据值那块内存地址。有时被称为变量左值。在下面赋值表示式中: count = count + 5变量count同时出现在赋值操作左边和右边。右边变量被读取,读出其关联内存中数据值。而左边count用作写入,原来值会被加法操作结果覆盖。在这个表示式赋值号右边,count和“5”用作右值,而左边count用作左值。3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const限定词 volatile限定词第48页变量定义与申
39、明定义变量变量定义会引发相关内存分配,因为一个变量只能在内存中占据一个位置,所以程序中每个变量只能定义一次。变量定义普通格式为: 类型 名字;也能够一次定义多个同类型变量,以下: 类型 名字1,名字2;比如:int ival;ival=5; /定义ival后就能够使用ivalint a, b, c; /定义三个int变量a,b,c3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const限定词 volatile限定词第49页变量定义与申明申明变量假如在一个文件中定义了一个变量,其它文件还想使用这个变量,就必须申明该变量。变量申明(declaration)作用是使程序
40、知道该变量类型和名字。申明不会引发内存分配,程序中能够包含对同一变量多个申明。申明全局变量格式:extern 类型 变量名;3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const限定词 volatile限定词第50页变量定义与申明申明变量/module0.cppint k=2; /定义变量k/module1.cpp#include /申明变量k/说明了在module1.cpp之外某处有k定义extern int k; int main() int t=3; /定义变量t,同时也是申明 k = t+2;/使用变量k3运算符和表示式4语句5小结1数据类型常量和变量2
41、 文字常量 变量和标识符 const限定词 volatile限定词第51页变量初始化定义变量同时可认为变量提供初始值,否则对于全局变量,系统会自动提供初始值0 ,而局部变量是未初始化。因为引用未初始化变量是程序中常见错误,且不易被发现,所以建议为每个定义变量提供一个初始值。C+支持两种形式初始化:使用赋值操作符显式语法形式(也叫赋值初始化): int value = 1024 ; char ch = t;将初始值放在括号中隐式形式(也叫直接初始化): int value (1024); char ch(t);3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const
42、限定词 volatile限定词第52页3.2.3 const限定词 3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const 限定词 volatile限定词由const限定对象不可改变。const在C+中使用方法非常多,主要有:限定一个对象(变量)限定指针限定引用类组员函数参数&返回值 第53页限定一个对象3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const 限定词 限定对象 限定指针 限定引用 volatile限定词程序中经常会使用一些常数值,如数组大小。可是程序代码中假如充满着这些数值,会降低程序可读性和可维护性。C语言中我们
43、使用预处理指令#define定义符号常量,不过这种常量缺点在于它只是作简单字符串替换,没有类型检验。C+中引入了const限定符,它将一个对象限定为常量。如: const int bufSize = 1024;企图修改这个值会造成编译错误。因为常量在定义后不能修改,所以必须进行初始化。 第54页限定指针首先回顾一下指针:#include using namespace std;int main( ) int ival=1024; int *pi=&ival; cout sizeof(pi): sizeof(pi) endl; cout sizeof(ival): sizeof(ival) en
44、dl; cout &pi: &pi endl; cout pi: pi endl; cout &ival: &ival endl; cout *pi: *pi endl; cout ival: ival endl; 3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const 限定词 限定对象 限定指针 限定引用 volatile限定词DEV-C+结果以下:sizeof(pi):4sizeof(ival):4&pi:0 x22ff70pi:0 x22ff74&ival:0 x22ff74*pi:1024ival:1024第55页限定指针从程序结果能够看出:指针在内存中
45、占4个字节,首地址是0 x22ff70,其中存放是它所指向内容首地址,int型变量ival在内存中占4个字节,首地址是0 x2274,这块内存存放是ival值1024。22ff70H22ff74H22ff741024指针pi所在内存,放是ival首地址变量ival所在内存,放是ival值3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const 限定词 限定对象 限定指针 限定引用 volatile限定词第56页问题:在这个例子中,假如我们不允许修改ival值(即1024),怎么办呢?显然能够将ival定义成常量: const int ival = 1024;那么能
46、否经过间接方式修改一个常量呢?比如: const int ival = 1024; int *pi = &ival; *pi = 500; /能够修改吗?指向常量指针(1)3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const 限定词 限定对象 限定指针 限定引用 volatile限定词第57页这段代码会造成编译错误, 理由并不是试图经过指针间接修改const,而是“试图将一个const地址赋值给一个非const指针”。要保留ival地址,只能将pi定义成一个指向const int 指针,成为指向常量指针: const int ival = 1024; cons
47、t int *pi = &ival;/OK /或:int const *pi = &ival; /OK *pi = 500; /Error指向常量指针(2)3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const 限定词 限定对象 限定指针 限定引用 volatile限定词第58页在上面代码中,pi是一个指向常量指针,它所指向内存中内容不能够改变。 指向常量指针(3)22ff70H22ff74H22ff741024const int *piconst int ivalpi指向内存中内容(即1024)不能变3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量
48、 变量和标识符 const 限定词 限定对象 限定指针 限定引用 volatile限定词第59页指向常量指针(4)注意:pi是一个指向常量指针,但pi本身值能够改变,指向另一个const int。比如:#include using namespace std;int main(int argc, char *argv ) const int ival = 1024; const int *pi = &ival; /pi首先指向const int ival cout &pi: &pi endl; cout pi: pi endl; cout &ival: &ival endl; const in
49、t ival1 = 100; pi = &ival1; /pi再指向ival1 cout &pi: &pi endl; cout pi: pi endl; cout &ival1: &ival1 endl;3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const 限定词 限定对象 限定指针 限定引用 volatile限定词运行结果:&pi:0 x22ff70pi:0 x22ff74&ival:0 x22ff74&pi:0 x22ff70pi:0 x22ff6c&ival:0 x22ff6c第60页指向常量指针(6)22ff70H22ff74H22ff6c1024c
50、onst int *piconst int ivalpi指向ival1;pi所在内存中值发生改变,变成了ival1地址22ff6cHconst int ival11003运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const 限定词 限定对象 限定指针 限定引用 volatile限定词程序运行中指针改变情况:第61页指向常量指针(7)C+允许将一个非const地址赋值给const指针,比如:int ival=1024;const int *pi=&ival;/OK,ival没有被限定为const,能够改变ival=500; /!Error,经过pi来改变ival不
51、能够,因为pi是const int*pi=500; 3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const 限定词 限定对象 限定指针 限定引用 volatile限定词第62页我们也能够定义指向非const 对象指针常量,该指针所在内存值不允许改变即该指针一旦用某个单元地址值初始化,那么指针值就不能再改变,但它所指向单元值能够改变,语法以下:int ival = 1024;int* const pi = &ival; / const限定pi,即pi是一个常量,它指向而且一直指向ival/不过*pi能够改变,因为pi指向是一个int而不是const int*pi
52、= 500; /OKint ival1 = 100;pi = &ival1; /!Error不能改变pi值指向非const对象const指针(1) 3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const 限定词 限定对象 限定指针 限定引用 volatile限定词第63页指向非const对象const指针(2) 22ff70H22ff74H22ff741024int * const piint ivalpi所在内存中值不能改变(即22ff74不能变)pi指向内存中内容(即1024)能够变3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符
53、const 限定词 限定对象 限定指针 限定引用 volatile限定词第64页指向const对象const指针 const int ival = 5;const int* const pi = &ival; /pi是一个指向const对象const指针在pi定义中:第一个const限定int,表示指针指向单元是常量;第二个const限定pi,表示指针值也是一个常量。所以该指针所在内存值不允许改变,它所指向内存值也不能改变。3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const 限定词 限定对象 限定指针 限定引用 volatile限定词第65页限定引用cons
54、t也能够限定引用,const引用能够用不可寻址值初始化,如:int& ri = 10;/Error,10是文字常量,不可寻址const int& rc = 10; /OK/编译器生成一个值为10暂时对象,rc指向这个对象除了限定对象、引用和指针,const另一个用途是限定函数形式参数,由const限定参数在函数体中不能被修改。3运算符和表示式4语句5小结1数据类型常量和变量2 文字常量 变量和标识符 const 限定词 限定对象 限定指针 限定引用 volatile限定词第66页3.2.3 volatile限定词 3运算符和表示式4运算5小结1数据类型常量和变量2 文字常量 变量和标识符 co
55、nst 限定词 volatile限定词const和volatile一起被称为CV限定词,volatile使用语法和const相同。当一个对象值可能在编译器控制或检测之外被改变时,那么该对象应该申明为volatile,比如一个被系统时钟更新对象。编译器执行一些例行优化行为不能应用在volatile对象上。volatile普通用在多线程或中止处理程序设计中。第67页3.3 运算符和表示式4语句5小结1数据类型2常量和变量运算符和表示式3操作数和应用在这些操作数上运算符组成了表示式。表示式指定了一个计算,会产生一个结果,即表示式值。当一个表示式中包含两个或两个以上运算符时,它被称为复合表示式。复合表
56、示式计算次序由运算符优先级和结合性决定。C+语言提供了丰富运算符,依据操作数个数,能够分为一元运算符、二元运算符,C+中还有一个三元运算符。也能够依据运算符特点进行分类,比如算术运算符、位运算符、赋值运算符等。全部运算符都会从操作数中产生一个值,大多数运算符都不会改变操作数,不过有运算符会修改操作数值,这称为运算符副作用。 第68页3.3.1 算术运算符算术运算符包含: *、/、%、+、注意: “/”和“%”运算右操作数不能为0。两个整数“/”运算结果还是整数,即整除。“%”运算符只能应用于整值类型操作数,两个非负整数进行“%”运算,余数为非负值,不然余数符号取决于实现。“+”和“”也能够作用
57、于指针类型变量。指针加法普通形式是: pointer + number;指针减法除了能够像上面加法形式之外,还能够进行两个指针减法,普通要求这两个指针指向同一数组元素,其结果是它们指向数组元素下标之差。4语句5小结1数据类型2常量和变量运算符和表示式3 算术运算符 关系/逻辑运算符 赋值运算符 自增和自减 位运算符 sizeof 运算符 new和delete 条件运算符 逗号运算符 运算符优先级 类型转换第69页例 :韩信点兵不足百人,三人一行多一个,七人一行少两个,五人一行恰好,问有多少人。例 :韩信点兵不足百人,三人一行多一个,七人一行少两个,五人一行恰好,问有多少人。第70页3.3.2
58、关系和逻辑运算符关系运算符有:,=,= =,!=逻辑运算符有:!,&,|。逻辑运算和关系运算计算结果是bool类型,即true或false。在需要整值类型环境中,它们结果会被自动提升为1(true)或者0(false)。逻辑与和逻辑或运算计算次序是从左至右,只要能够得到表示式值,运算就会结束,这种现象被称为逻辑运算短路。即,对于表示式expr1 &(|) expr2,假如expr1计算结果为false(true),则整个逻辑与(逻辑或)表示式值为false(true),不会再计算expr2。4语句5小结1数据类型2常量和变量运算符和表示式3 算术运算符 关系/逻辑运算符 赋值运算符 自增和自减
59、 位运算符 sizeof 运算符 new和delete 条件运算符 逗号运算符 运算符优先级 类型转换第71页判断某年是否为闰年(假如是闰年,它应能被4整除,但不能被100整除,或被100整除,也能被400整除)bool isLeapYear(int year)bool n1 = (year%4=0);bool n2 = (year%100=0);bool n3 = (year%400=0);if (n1=true&n2!=true)|(n2=true&n3=true)return true;else return false; 第72页3.3.3 赋值运算符赋值运算符包含“=”和复合赋值运算
60、符。赋值运算符左操作数必须是可修改左值。右操作数类型必须与左操作数类型完全匹配,不然编译器会自动将右操作数类型转换为左操作数类型,假如不能进行转换,会引发编译错误。赋值运算是有副作用,它改变了左操作数。赋值表示式本身值是实际赋给左操作数值,比如:int ival; ival = 1; /结果是1ival = 2.5;/结果是24语句5小结1数据类型2常量和变量运算符和表示式3 算术运算符 关系/逻辑运算符 赋值运算符 自增和自减 位运算符 sizeof 运算符 new和delete 条件运算符 逗号运算符 运算符优先级 类型转换第73页复合赋值运算符C+还提供了一组复合赋值运算符,普通语法格式
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年人教版小学三年级数学上册第八单元第12课《小数四则运算》公开课教案
- 快件派送员安全演练能力考核试卷含答案
- 铸管工安全生产基础知识水平考核试卷含答案
- 石油开采工变更管理强化考核试卷含答案
- 网版印刷员安全文明知识考核试卷含答案
- 手风琴校音工岗位知识掌握考核试卷含答案
- 中药药剂员技术改进知识考核试卷含答案
- 电光源装配工岗前安全实践考核试卷含答案
- 钟表设计师保密模拟考核试卷含答案
- 催化剂试验工岗中心理健康考核试卷含答案
- 风湿免疫科|系统性红斑狼疮教学查房完整课件
- 2026年出租厂房安全责任告知书
- 2026广西壮族自治区机关事务管理局公开招聘广西实验幼儿园实名编制10人笔试备考试题及答案详解
- 江西文化演艺发展集团有限责任公司招聘笔试真题2025
- 2026年黑龙江哈三中高三一模英语试题含答案
- 放射治疗科直线加速器操作规范
- 雨课堂学堂在线学堂云《跨文化交际英语(北京理工)》单元测试考核答案
- 尺神经松解术课件
- 承包果园套袋合同范本
- 2024年《广西壮族自治区房屋修缮工程消耗量定额(建筑装饰工程)》
- 医院供氧系统安全管理
评论
0/150
提交评论