1 / 78

第 2 章 C++ 语言编程基础

第 2 章 C++ 语言编程基础. 2.1 字符集 2.2 词法记号和空白 2.2.1 词法记号 2.2.2 空白 2.3 基本数据类型 2.4 变量与常量 2.4.1 变量 2.4.2 常量 2.5 枚举类型. 2.6 数组类型 2.7 关键字 typedef 2.8 运算符 2.9 表达式 2.10 数据类型转换 2.11 控制语句 2.11.1 选择语句 2.11.2 循环语句 2.11.3 转移语句.

judith
Download Presentation

第 2 章 C++ 语言编程基础

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第 2 章C++语言编程基础 2.1 字符集 2.2 词法记号和空白 2.2.1 词法记号 2.2.2 空白 2.3 基本数据类型 2.4 变量与常量 2.4.1 变量 2.4.2 常量 2.5 枚举类型 2.6 数组类型 2.7 关键字typedef 2.8 运算符 2.9 表达式 2.10 数据类型转换 2.11 控制语句 2.11.1 选择语句 2.11.2 循环语句 2.11.3 转移语句

  2. 本章介绍C++语言的基础概念,如:字符集、词法记号、基本数据类型、变量和常量等;讨论两种自定义数据类型:枚举和数组类型;并通过大量实例演示控制语句在C++程序中的使用。本章介绍C++语言的基础概念,如:字符集、词法记号、基本数据类型、变量和常量等;讨论两种自定义数据类型:枚举和数组类型;并通过大量实例演示控制语句在C++程序中的使用。 字符是C++语言的基本要素,是程序中可以区分的最小符号。 表 C++语言字符集的构成 英文字母 A ~ Z , a ~ z 数字字符 0 ~ 9 特殊字符 空格 ! # % ^ & * _ (下划线 )+=- ~ 〈〉 / \︱′〃 ; . , ()        [] {} : ?    【2.1 字符集】

  3. 【2.2 词法记号与空白】 1. 关键字 词法记号是C++语言的最小语法单位。 编译时,词法分析将C++程序正文分解为词法记号和空白。 关键字——是C++语言的保留字,是具有特殊含义的专用单词。 特点: 它们各自有不同的使用目的,在程序中不能用作别的用途。 C++语言中共有5种词法记号:关键字、标识符、文字常量、运算符和分隔符。 【2.2.1 词法记号】

  4. 【 2.2.1 词法记号 】 2. 标识符 标识符是程序员为命名程序中的一些要素所定义的单词,如变量名、函数名等。 表 标识符的命名规则 标识符的命名规则 举例 由字母、数字和下划线组成 正确的 错误的 以字母或下划线作为第一个字符, 其后跟0个或多个字母、数字、下划线。 sum、 Dram_ rectangl e 、_my friend 2_peo //起始字符非法 operator //是关键字 my $ //含有非法字符 大写字母与小写字母分别代表不同的标识符 不能与关键字相同

  5. 3. 文字常量 又称文字,指在程序中直接使用符号标示的数据,包括数字、字符、字符串等。 4. 运算符 运算符——是C++语言是实现加、减等各种运算的符号。 5. 分隔符 编写程序时,分隔符用于分隔词法记号或程序正文。 常用的分隔符有 () {} , : ; 注 C++编译器将注释也当作空白对待 空白包括空格符(空格键所产生的字符)、制表符(TAB键所产生的字符) 、换行符(Enter键所产生的字符)。 【 2.2.2 空白 】

  6. 【2.3 基本数据类型】 基本数据类型 数据类型的分类 自定义数据类型 布尔型(bool) 字符型(char) 基本数据类型的分类 整型(int) 浮点型(float、double) signed(表示有符号) unsigned(表示无符号) 4个关键字 short(表示短型) long(表示长型) 数据是程序处理的对象,C++语言中,所有的对象都属于某种数据类型。 4个关键字(修饰符)可用来作为前缀修饰字符型、整型、浮点型。

  7. 【表 C++语言的基本数据类型】 取值范围 类型 长度(字节) 1 false(0) true(1) bool 1 -128~127 char 1 -128~127 signed char 1 0~255 unsigned char 2 -32768~32767 short int(short) 2 -32768~32767 signed short int(signed short) 2 0~65535 unsigned short int(unsigned short) 4 -2147483648~2147483647 int 4 signed int -2147483648~2147483647 unsigned int 4 0~4294967295 long int(long) 4 -2147483648~2147483647 signed long int(signed long) 4 -2147483648~2147483647 unsigned long int(unsigned int) 4 0~4294967295 float 4 3.4E-38~3.4E+38 double 8 1.7E-308~1.7E+308 long double 8 1.7E-308~1.7E+308

  8. 【 2.4 变量与常量】 变量 数据的值在程序运行过程中是可以改变的 数据的值在运行期间是不允许改变的 一个变量对应着计算机中的一组内存单元,这组内存单元在C++语言中用一个标识符来标识,即变量名。 注意 C++语言中使用变量前必须对变量进行声明。变量声明的格式如下: 数据类型 变量名1,变量名2,…,变量名n; 数据类型可以是C++语言中的任一合法类型,每个变量都必须属于一种类型。变量名的命名应遵照标识符的命名规则。 在声明变量时,必须注意变量类型的选择。应该保证该变量中将要存储的值不突破该变量类型所能表示的最大值。 常量 【 2.4.1 变量】

  9. 【2.4.2 常量】 文字常量 数据类型是由它的表示方法决定的。 常量的分类 符号常量 1. 整型常量 表 整型常量的3种形式 组成 备注 形式 举例 由若干个0~9的数字组成,但不能以0开头 L(或l)表示长整型,U(或u)表示无符号型,如果后缀包括L(或l)和U(或u)则表示无符号长整型。 十进制 1980,-50 以0开头,由若干0~7的数字组成 八进制 010,-0276 0x1Fa -0X4Ab 以0X或0x开头,由若干0~9的数字及A~F(大小写均可)的字母组成 十六进制 整型常量就是以文字形式出现的整数,包括3种形式。各种表示形式前均可加上正或负号以表示它们值的正负,正号可以省略。

  10. 【2.4.2 常量】 2. 实型常量 一般表示形式 实型常量只能用十进制表示,共有两种表示形式 指数表示形式 表 实型常量的两种形式 组成 备注 形式 举例 默认数据类型为double型,如果加上后缀F(或f)则为float型,加上L(或l)则为long double型。 又称小数表示形式。使用这种表示形式时,实型常量由整数和小数两部分组成。其中的一部分在实际使用时可省略,但不允许两部分同时省去。 10.2,10.,.2 一般表示 表示很大或很小的实数,由尾数部分、字母E(或e)、指数部分三部分组成。尾数部分的表示和一般表示形式相同,指数部分必须是整数,但可正可负,当指数大于零时,正号可省。 1.2E20,.24e100,12.E7 指数表示

  11. 【2.4.2 常量】 字符常量通常是指用单引号括起来的一个字符,其数据类型是char。其中单引号只是用来说明被它括起来的字符是字符常量,它本身不是字符常量的内容。如:′a′,′#′,′G′。 表12 C++预定义的转义序列 是用转义符号“\”后跟一个字符或一个ASCII码来表示一个单一字符。若“\”后跟一个ASCII码,则表示的是该ASCII码所代表的字符。 符 号 含 义 响铃 \a \b 退格(Backspace键) 换页 \f 换行 \n 回车 \r \t 水平制表符(Tab键) 垂直制表符 \v \\ 反斜杠 \″ 双引号 \′ 单引号 3. 字符常量 C++语言中,还有一种转义序列的表示方法可用来表示字符常量。 在这里ASCII码用八进制或十六进制表示,这里八进制和十六进制的表示与前面表示整型常量的方式不同,应无第一个“0”。例如′\X62′就表示字符′b′。

  12. 【2.4.2 常量】 字符常量在内存中以ASCII码形式存储,每个字符占一个字节。 在C++语言中已经有了其他特定的含义:“\”是转义字符;“′”被用于表示字符常量,“″”用于表示字符串常量。如果需要把它们用作字符常量,就必须采用转义序列。 4. 字符串常量 注 由于双引号在字符串中用做定界符,所以,若字符串中需要出现双引号时,则必须采用转义序列。 C++语言中字符串的存储与字符不同,它在内存中的存放并不是简单地按串中字符的顺序排放,而是在末尾加上一个′\0′,表示字符串的结束。 注 ″I″ I \0 字符串、字符及与其对应的存储形式 ′I′ I 字符串常量又称字符串或串常量,是用一对双引号括起来的字符序列。例如:″xyz″, ″I am a student″,″This is a string″

  13. 表 两种声明符号常量的方法 5. 布尔常量 布尔常量仅有两个:false(假)和true(真),其数据类型为bool。 C++语言中,经常用到符号常量。 注 符号常量在声明时一定要赋初值,而且其值在初始化后不能再改变,这一点与变量完全不同。C++语言提供了两种声明符号常量的方法。 用const声明符号常量 用#define声明符号常量 C++语言中广泛采用的声明符号常量的方法 C语言中声明符号常量的方法。其中#define是预处理指令。缺点是不能显式声明常量的类型。 解释 const 数据类型 常量名=常量值; 或: 数据类型 const 常量名=常量值; 形式 正确声明 const double pi=3.1415926; #define pi 3.1415926 const double pi; //错误 pi=3.1415926; //错误 错误声明 最后不允许加 “;”

  14. 【 2.5 枚举类型】 枚举类型的声明 例 2-4 说明:red的值为0,blue的值为1,white的值为2,black的值为3,green的值为4。 enum color {red,blue,white,black,green}; 声明枚举类型时,并不一定需要对枚举常量初始化,枚举常量取默认值,即第一个常量的值为0,其他常量的值为前一个常量的值加1。 在声明枚举类型时,用户需要把变量的可能取值一一枚举出来,形式如下: enum 枚举类型名 {变量值1,变量值2,…变量值n}; 在声明枚举类型时,枚举出的变量的可能取值又称枚举常量。

  15. 每个枚举常量实际上就是一个整数值,其值可以在声明枚举类型时以初始化的方式指定。例如: enum color {red,blue=100,white,black=50,green}; 说明:red=0,blue=100,white=101,black=50,green=51。 被赋值的常量取所赋的值,没有赋值的常量取默认值。 在给枚举常量赋初值时,不一定要求常量的值互不相同。例如: enum color {red,blue=100,white,black=100,green=0}; 【 2.5 枚举类型】

  16. 【 2.5 枚举类型】 在声明枚举类型后,必须声明枚举变量才能使用这种数据类型。格式如下(其中enum可有可无): enum 枚举类型名 变量1,变量2,…,变量n; 事实上,也可以在声明枚举类型的同时,声明枚举变量。例如: enum color {red,blue,white,black,green} flower; enum {red,blue,white,black,green} flower; 说明:声明了一个无名的枚举类型,并声明了一个名为flower的枚举变量。使用这种方法,程序的其他地方就不能再声明这种类型的枚举变量了。 给枚举变量赋值时,必须注意枚举变量的值应该是所属枚举类型的 某一枚举常量。 例如: enum color {red,blue,white,black,green}; enum color flower(red); flower=white;

  17. 例 2-5 枚举类型的应用 #include<iostream.h> enum Sex {Male,Female}; int main() { int i; Sex s; cout<<"请输入性别: 0-男, 1-女"; cin>> i; s=Sex(i); if(s==Male) { // if语句的使用本章后面讲解 cout<<s<<endl; cout<<"性别:男"<<endl; } else { if(s==Female) { cout<<s<<endl; cout<<"性别:女"<<endl; }

  18. (续) else { cout<<s<<endl; cout<<"对不起,性别输入错误!"<<endl; } } return 0; } 提示用户输入 请输入性别: 0-男, 1-女 输入 0 输入 2 0 性别:男 2 对不起,性别输入错误! 输入 1 1 性别:女 枚举变量的值是一个整数。如果希望输出其标识符,程序中需要另外处理。

  19. 【 2.6 数组类型】 数组的声明形式如下: 给出了数组中元素的类型,它可以是C++语言中任一合法类型。 常量表达式又称下标表达式,必须是unsigned int类型的整数。 常量表达式n表示的是第n维的大小。 注 是一个标识符,代表着数组元素在内存中的起始地址,是一个常量,不能给它赋值。 “[]”的个数代表着数组的维数。一个方括号表示一维数组,两个表示二维数组,…,n个表示表示n维数组。 这些表达式的值的乘积就是数组元素的个数。 数组是类型相同、数目一定的变量的有序集合,组成数组的变量称为该数组的元素。在内存分配时,数组对应着一组顺序排放的存储单元,数组的每个元素按照声明时的次序在其中存放。 数据类型 数组名[常量表达式1][常量表达式2]…[常量表达式n];

  20. 下标表达式的个数应与数组的维数相同,下标表达式的值从0开始。下标表达式的个数应与数组的维数相同,下标表达式的值从0开始。 声明了一个一维数组 声明了一个二维数组 举例 int i[5][2]; char c[5]; c是数组名,数组有5个元素,每个元素都是char型变量。 i是数组名,数组有10个元素,都是int型变量。 解释 下标表达式也限定了数组中元素的排列次序及每个元素在数组中的位置,我们可以通过数组名和下标顺利地访问其中的每一个元素。 访问数组中元素的一般形式如下: 数组名[下标表达式1][下标表达式2]……[下标表达式n] int i[5][2]; char c[5]; 有10个元素:i[0][0],i[0][1], i[1][0],i[1][1], i[2][0], i[2][1], i[3][0], i[3][1], i[4][0],i[4][1]。 有5个元素:c[0], c[1], c[2], c[3], c[4]。

  21. 数组元素在内存中是顺序存储的。 i[0] i[3] i[4] i[1] i[2] 图 一维数组的存储 i[0][0] i[0][2] i[1][0] i[1][2] i[0][1] 图 二维数组的存储 i [0] [0] [0] i [0] [0] [1] i [0] [0] [3] i [0] [1] [0] i [0] [1] [1] i [0] [0] [2] i [0] [1] [2] i [0] [1] [3] i [0] [2] [1] i [0] [2] [2] i [0] [2] [3] i [0] [2] [0] i [1] [0] [0] i [1] [0] [1] i [1] [0] [3] i [1] [1] [0] i [1] [1] [1] i [1] [0] [2] i [1] [1] [2] i [1] [1] [3] i [1] [2] [1] i [1] [2] [2] i [1] [2] [3] i [1] [2] [0] 图 三维数组的存储 一维数组:就是简单地按下标顺序存储。 例如: int i[5]; 二维数组:可以把它看成是由多个一维数组构成的。 例如: int i[2][3]; 三维数组:可把它看成是由多个二维数组构成的。 例如: int i[2][3][4];

  22. 一个n维数组可看成是由多个n-1维数组构成的。一个n维数组可看成是由多个n-1维数组构成的。 进行数组声明时,也可以给其中部分或全部元素赋初值。 对于一维数组,初始化有以下两种形式: 形式 举例 例题解释 int i[5]={1,2,3,4,5}; (1)全部元素都初始化 声明了一个有5个元素的数组,每个元素都被赋初值。其中i[0]=1,i[1]=2,i[2]=3,i[3]=4, i[4]=5。 在声明时可不说明数组元素的个数。元素的个数与初始化数据的个数相同。 (2)部分元素被初始化 int i[5]={1,2}; 初始化了数组的前两个元素:i[0]= 1,i[1]=2。其他元素则未赋值,程序一般都自动给它们赋0。 注 对于全部元素都被初始化的情况,还有如下声明形式: int i[]={1,2,3,4,5};

  23. 多维数组的初始化与一维数组相似,需要注意的是必须按照前面所讲的存储顺序列出数组元素的值。多维数组的初始化与一维数组相似,需要注意的是必须按照前面所讲的存储顺序列出数组元素的值。 说明:把i[0][0]初始化为1,i[0][1]初始化为2,i[0][2]初始化为3,i[1][0]初始化为4,i[1][1]初始化为5,i[1][2]初始化为6。 等价 说明:把i[0][0]初始化为1,i[0][1]初始化为2,i[0][2]初始化为3,i[1][0]初始化为4,其他取默认值0。 int i[2][3]={ {1,2,3}, {4,5,6}}; 等价 int i[2][3]={ {1,2,3}, {4,5,6}}; 例如: int i[2][3]={1,2,3,4,5,6}; 多维数组也可以只初始化部分元素,例如: int i[2][3]={1,2,3,4 }; 如果在声明的同时给元素赋初值,最多可以省略第一维中的下标个数, 例如: int i[][3]={ {1,2,3}, {4,5,6}}; int i[][]={ {1,2,3}, {4,5,6}};

  24. 与数组元素的初始化不同,在给数组元素赋值时,必须逐一进行。例如:对于下述的数组初始化: 须注意在赋初值时,初始值表中的数据个数不能多于数据元素的个数。例如: int i[5]={1,2,3,4,5,6}; 就是错误的,程序在编译时,系统会报错。 等价 注 在给数组元素赋值时,一定要注意数组越界问题。 int i[3]; i[0]=1; i[1]=2; i[2]=3; 数组元素可以是C++语言中的任一合法数据类型,自然也就可以是char型,即字符型。 不过由于C++语言中没有字符串类型,我们通常采用字符数组来存放和处理字符串,因此,它又有一些特殊的地方。 int i[3]={1,2,3 };

  25. C++语言中,一个字符串是用一个以′\0′结尾的一维字符数组来表示的,这个字符数组的声明和初始化可以采用和其他数组相同的方式。C++语言中,一个字符串是用一个以′\0′结尾的一维字符数组来表示的,这个字符数组的声明和初始化可以采用和其他数组相同的方式。 例如:对于字符串:″abcd″, 可以声明和初始化为: char str[5]={ ′a′, ′b′, ′c′, ′d′, ′\0′}; 等价 char str[5]= ″abcd″; 说明:因为声明的数组只有4个元素,而初始化时有5个字符作为数据项:′a′、′b′、′c′、′d′、′\0′。其中字符′\0′是字符串的结束符,在用字符串方法初始化时,系统会自动加上。 char str[4]= ″abcd″;

  26. 多维字符数组可以用来表示多个字符串,其初始化同样有两种方法。多维字符数组可以用来表示多个字符串,其初始化同样有两种方法。 例如:对于字符串″abcd″、″hijk″、″opqr″ 可以声明和初始化为: char str[3][5]={{ ′a′, ′b′, ′c′, ′d′, ′\0′},{′h′, ′ i′, ′j′, ′k′, ′\0′},{′o′, ′p′, ′q′, ′r′, ′\0′}}; 等价 注 char str[3][5]={ ″abcd″,″hijk″,″opqr″ }; 等价 char str[][5]={ ″abcd″,″hijk″,″opqr″ }; 字符数组的赋值规则与其他类型数组一样,必须逐个元素赋值。

  27. 来由:在使用C++语言的某些数据类型(如:unsigned long int)声明变量时,如果需多次键入该类型,非常繁琐,且容易出错。为此,C++语言提供了关键字typedef,它可以为这样的类型建立一个或多个别名。 形式如下: typedef 已有类型 别名1,别名2,…,别名n; 例如: typedef unsigned long int ULONG; 建立别名后,就可以利用这个别名来声明这种类型的变量。 如:ULONG i; 注 与前面建立新类型不同,这里利用关键字typedef仅仅是为一个类型的名字起了别名。 【 2.7 关键字typedef】

  28. 【2.8 运算符】 运算符具有优先级与结合性。 运算是指对数据的求值计算,如:加、减运算等。运算符给出了计算的类型,而参与运算的数据叫操作数(变量、常量)。 算术运算符 运算符的分类 一元运算符 需要1个操作数 关系运算符 二元运算符 需要2个操作数 按所要求的操作数的多少 三元运算符 需要3个操作数 逻辑运算符 … 运算性质分

  29. 【 2.8 运算符】 当一个表达式中含有多个运算符时,先进行优先级高的运算,后作优先级低的运算。如果表达式中出现了多个相同优先级的运算时,运算的顺序就要看运算符的结合性了。 结合性是指当一个操作数左右两边的运算符优先级相同时,按什么顺序进行运算,是自左向右,还是自右向左。 功 能 说 明 结 合 性 优 先 级 运 算 符 ( ) 改变优先级 从左至右 : : 作用域运算符 1 [ ] 数组下标 . -> 成员选择符 .* ->* 成员指针选择符 * 间接访问 从右至左 2 & 取地址 new delete 动态内存分配

  30. (续) 功 能 说 明 结 合 性 优 先 级 运 算 符 sizeof 求所占内存字节数 从右至左 ! 逻辑求反 2 ~ 按位求反 ++ -- 增1、减1运算符 + - 取正 、 取负 ( ) 强制类型 从左到右 3 * / % 乘法、除法、求余 + - 加法、减法 从左到右 4 5 << >> 左移位、右移位 从左到右 < > <= >= 小于、大于、小于等 于、 大于等于 从左到右 6 == != 等于、不等于 从左到右 7 8 & 按位与 从左到右 9 ^ 按位异或 从左到右 | 按位或 从左到右 10

  31. (续) 功 能 说 明 结 合 性 优 先 级 运 算 符 11 && 逻辑与 从左到右 从左到右 12 | | 逻辑或 ? : 条件运算符 从右到左 13 = += -= *= /= %= & =^= |= 赋值运算符 <<= >>= 14 从右到左 , 逗号运算符 从左到右 15 表 C++中常用运算符的功能、优先级和结合性 1. 算术运算符 (1)基本算术运算符 一元运算符: +(取正)、-(取负) 二元运算符: +(加)、-(减)、*(乘)、/(除)、%(取余) C++语言中的算术运算符包括基本算术运算符和增1、减1运算符。

  32. (2)增1、减1运算符 %运算符要求它的两个操作数必须是整数或字符型数据,其优先级与结合性和“/”运算符相同。求两个数的余数的表达式如下: 操作数1%操作数2 其计算结果是操作数1被操作数2除的余数,即余数=操作数1-操作数2*整商(整商为操作数1除以操作数2所得的整数商)。例如: 10%4 //结果是2 注 对于“/”运算符,当它的两个操作数都是整数时,其计算结果应是除法运算后所得的商的整数部分。例如 5/2的结果是2。 增1、减1运算符都是一元运算符,这两个运算符都有前置和后置两种形式。 前置形式是指运算符在操作数的前面,后置是指运算符在操作数的后面。例如: I++; //++后置 --J; //--前置

  33. 2. 关系运算符 无论是前置还是后置,这两个运算符的作用都是使操作数的值增1或减1。但操作数和运算符组成的表达式的值并不相同。假设I=2,J=3,看下面的两个例子: I++; ++J; 经过计算后: 表达式的值为2,I值为3 表达式值为3,J值为3 前置形式是先计算操作数的值(增1或减1),后把操作数的值作为表达式的结果。 后置形式是先将操作数的值作为表达式的结果,然后把操作数的值增1或减1。 注 在进行算术运算时,还需注意计算中的溢出问题。计算机中,每种基本数据类型都有一定的取值范围。对于实数,如果运算结果超出范围,程序将被异常中止。另外,整数或实数被零除也会导致程序异常中止。 关系运算符都是二元运算符,共有6个:<(小于)、 >(大于)、<=(小于或等于)、>= (大于或等于)、== (等于)、!=(不等于)。

  34. 3. 逻辑运算符 关系运算符用于比较两个操作数的大小,其比较的结果是一个bool型的值。当两个操作数满足关系运算符指定的关系时,表达式的值为true,否则为false。true等于1,false等于0,所以,关系运算符的比较结果可以作为算术运算中的操作数。 一元运算符: !(逻辑求反) 若其操作数为0(false),运算结果为true(1),否则为false(0)。 &&(逻辑与) 只要两个操作数中有一个为0(false),运算结果就为false(0),否则为true(1)。 二元运算符 只要两个操作数中有一个不为0(false),运算结果为ture(1),否则为false(0)。 | |(逻辑或) 4. sizeof运算符 该运算符的使用形式如下: sizeof(数据类型); sizeof运算符用于计算其操作数在内存中所占的字节数。它是一个一元运算符,操作数可以是C++语言中任一合法的数据类型。

  35. 5. 位运算符 一元运算符: ~(按位求反) &(按位与) | (按位或) 二元运算符 ^(按位异或) <<(左移位) >>(右移位) 位运算符是对其操作数按其二进制形式逐位进行运算,参与运算的操作数应为整数。 (1)按位求反(~) 按位求反的作用是对一个二进制数的每一位求反。 例如:计算~025 025: 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 ~025: 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0

  36. (2)按位与(&) 按位与操作的作用是将两个操作数对应的每一位分别进行逻辑与操作。 例如:计算3&5 3: 0 0 0 0 0 0 1 1 5:(&) 0 0 0 0 0 1 0 1 3&5: 0 0 0 0 0 0 0 1 (3)按位或(|) 按位或操作的作用是将两个操作数对应的每一位分别进行逻辑或操作。 例如: 计算3|5 3: 0 0 0 0 0 0 1 1 5:(|) 0 0 0 0 0 1 0 1 3|5: 0 0 0 0 0 1 1 1

  37. (4)按位异或(^) 例如: 计算071^052: 071: 0 0 1 1 1 0 0 1 052:(^) 0 0 1 0 1 0 1 0 071^052: 0 0 0 1 0 0 1 1 移位运算符左边的操作数指定了需要作移位操作的数。右边的操作数指定了需要移动的位数,因而必须是一个整数表达式。 位异或操作的作用是将两个操作数对应的每一位进行异或,具体运算规则是:若对应位值相同,则该位运算结果为0;否则为1。 左移位(<<) 是将左操作数的二进制值向左移动指定的位数。左移后,低位补0,移出的高位舍弃。 右移位(>>) 右移位是将左操作数的二进制值向右移动指定的位数。右移后,移出的低位舍弃。如果是无符号数则高位补0;如果是有符号数,则高位补符号位或补0。 (5)移位

  38. 举例 0 0 0 0 0 1 0 0 右移位举例:表达式A>>2,结果为-2 有char型变量A,其值为-8,则A的二进制补码是11111000 1 1 1 1 1 0 0 0 图 A>>2的移位操作过程 移位运算的结果就是位运算表达式的值,参与运算的两个操作数的值并没有变化。 注 移位运算可替代乘或除以2或2的n次方运算。 左移位举例:表达式4<<1,结果为8 舍弃 0 图 4<<1的移位操作过程 1 1 舍弃 舍弃

  39. 【2.9 表达式】 表达式是由运算符和操作数组成的、用于计算的式子。 算术表达式 关系表达式 逻辑表达式 常见表达式分类 条件表达式 逗号表达式 赋值表达式 书写表达式时,必须注意运算符的优先级与结合性,确保列出的表达式实际求值顺序与自己所要求的一致。必要时可加括号以便于理解,甚至改变优先级。括号的使用可以嵌套。在计算时,先做内括号,再做外括号。 在表达式中,连续出现两个运算符时,最好用空白符分隔。 注 例如: i+ ++j i++ +j

  40. 例 2-6 1. 算术表达式 算术表达式是由算术运算符或位运算符与操作数组成的表达式。 表达式的值和类型由运算符和参与运算的操作数决定:当各操作数的数据类型相同时,表达式的类型就是操作数的类型;当类型不同时,表达式的类型是操作数中类型最高的操作数的类型。 算术表达式 #include<iostream.h> int main() { int I(1),J(1); cout<<I++<<'\t'<<++J<<endl; int A,B; A=3; B=5; cout<<(A&B)<<endl;

  41. 例 2-6 double X(2.5); cout<<X-(X+0.5)*(A|B); //参与运算的操作数类型不相同 cout<<endl; return 0; } 1 2 1 -18.5 算术表达式 2. 关系表达式与逻辑表达式 关系表达式是由关系运算符和操作数组成的,逻辑表达式由逻辑运算符与操作数组成。这两种表达式的值都应是1(true)或0(false)。 在进行由“&&”或“||”和操作数组成的逻辑表达式运算时,只对从左开始能够确定整个表达式值所需的最少数目的子表达式,即操作数进行计算,后面的表达式就不再计算了。 注

  42. 例 2-7 逻辑表达式 #include<iostream.h> int main(){ int i(1),j(1),k(3); --i&&j++&&k--; cout<<i<<'\t'<<j<<'\t'<<k<<endl; ++ i ||j--||--k; cout<<i<<'\t'<<j<<'\t'<<k<<endl; return 0;} 3. 条件表达式 唯一的一个三元运算符:条件运算符“?:”。条件运算符的结合性是自右向左。由条件运算符和3个操作数组成的式子叫条件表达式。 运算顺序是:先计算表达式1的值,若表达式1的值不为零,则计算表达式2,并把它的值作为条件表达式的值;否则计算条件表达式3,并把它的值作为条件表达式的值。类型为表达式2和表达式3中类型高的表达式的类型。 条件表达式的一般形式如下: 表达式1?表达式2:表达式3

  43. 例 2-8 条件表达式 #include<iostream.h> int main(){ int i(3),j(4),k; k=(i>j)?++i:++j; cout<<i<<'\t'<<j<<'\t'<<k<<endl; k=i-j?i+j:i-3?j:i; cout<<i<<'\t'<<j<<'\t'<<k<<endl; return 0; } 3 5 5 3 5 8 4. 逗号运算符 逗号也是一个运算符。使用逗号运算符可以将多个表达式组成一个表达式。 它的使用形式如下: 表达式1,表达式2,…,表达式n

  44. 由赋值运算符与操作数组成的表达式就叫赋值表达式。由赋值运算符与操作数组成的表达式就叫赋值表达式。 计算逗号表达式的值时,从左到右先计算第1个表达式的值,再计算第2个表达式的值,…,最后计算的表达式的值和数据类型便是整个表达式的值和类型。 i的值 4 4. 逗号运算符 5. 赋值表达式 基本赋值运算符: = += -= 分类 *= /+ %= 复合赋值运算符 <<= >>= &= ^= |= 例如: int i; i=(10-2,8/2);

  45. 对于基本赋值运算符组成的表达式,它的一般形式是: 说明:可以是C++语言中任一合法的表达式。 赋值表达式的作用就是把赋值运算符右边表达式的值赋给左边的变量。 赋值表达式的类型为左边变量的类型,其值为赋值后左边变量的值。 在C++中还可以连续赋值。 说明:首先将Z赋值为2.6,表达式Z=2.6的值也为2.6,接着表达式Z=2.6的值赋给Y,使Y的值为2.6,最后X被赋值为2.6,整个表达式的值也为2.6。 复合赋值运算符是由基本赋值运算符和二元算术运算符或位运算符结合在一起构成的。 变量=表达式 例如: X=2.6 //表达式的值为2.6 例如: X=Y=Z=2.6

  46. 【2.10 数据类型转换】 这些复合运算符组成表达式的一般形式为: 变量 复合赋值运算符 表达式 分解为 变量 算术运算符(或位运算符)= 表达式 等价 变量 = 变量 算术运算符(或位运算符) 表达式 例如: X*=2 //等价于X=X*2 X*=X+2 //等价于X=X*(X+2) C++语言支持不同数据类型的数据之间的混合运算。在对这样的表达式求值时,C++语言需要对其中的一些操作数进行类型转换

  47. 1. 隐含转换 隐含转换 表达式中的类型转换方式 强制转换 如果两个操作数的类型不同,系统将自动地把其中操作数类型低的转换成和另一个相同。 各种类型的高低顺序如下: int unsigned long unsigned long double char、short float 隐含转换的具体规则如下: long double ● char、short类型自动转换成int,float类型自动转换成double型。 ●两个操作数中有一个为long double类型,另一个将也转换成long double类型;否则,如果其中有一个为double类型,另一个将也转换成double型;…,如上顺序从低向高转换。

  48. 2. 强制类型转换 隐式转换的方向就是将一个取值范围较小的类型向取值范围较大的类型转换。它能确保在转换过程中数据不受损失。 注 类型的转换并不实际改变操作数的数据类型。它只是在计算表达式值的时候,将操作数的值临时做了转换。计算后,操作数仍保持原有的数据类型。 强制类型转换的作用是将某种类型强制地转换成指定的类型。 说明:第2种是C语言所采用的风格,在C++中一般选用第1种方式。 意义为把表达式的数据类型强制转换成类型说明符所指定的类型。 强制类型转换是通过强制转换运算符来实现的,具体表示形式如下: 类型说明符(表达式) 或 (类型说明符)表达式

  49. (续) 例如: int i; float x(4.5f),y; y=x-int(x); //将float类型转换成int类型,int(x)值为4,后隐式转 换继续计算得y值为0.5 注 强制类型转换并不改变操作数的数据类型。 当出现把高类型转换成低类型时有可能造成数据精度的损失,是一种不安全的转换。 在表达式的类型转换中,赋值表达式是一个特例。

  50. 语句可用于计算表达式的值、控制程序执行的顺序,有时语句也可能不作任何操作(空语句)。语句可用于计算表达式的值、控制程序执行的顺序,有时语句也可能不作任何操作(空语句)。 由表达式在最后加上分号组成。 例如: int i; // 将i声明为整型的语句 ● 表达式语句 空语句 仅由分号组成,在程序中不作任何操作。 例如: ; // 空语句 ● 块语句 如果把多条语句用“{}”括起来,就组成了一个复合语句。复合语句也称块语句。 在块语句的右括号后不再需要分号。 分类 ● 选择语句 ● 循环语句 ● 转移语句 【2.11 控制语句 】

More Related