C++程序设计(第二版)教材课件汇总完整版ppt全套课件最全教学教程整本书电子教案全书教案课件合集.ppt
C+程序设计(第二版)第1章 C+基础知识 程序设计语言是人类在计算机上解决实际问题的一种工具。当一个求解问题能够用数学模型表达时,人们会考虑用某种程序设计语言将该问题的数学模型表示成计算机可以接受的程序形式,再由计算机自动处理这个程序,生成人们所需要的结果。1.1 程序设计语言的基本概念1.面向过程的结构化程序设计语言2.面向对象的程序设计语言有两类:一类是完全面向对象的语言,另一类是兼顾面向过程和面向对象的混合式语言。C+语言就是后一种形式的典型代表。1.2C+程序的基本结构 1.2.1 C+程序结构 一般来说,C+程序的结构包含声明区、函数区两个部分,在任何一个区内都可以随时插入程序的注释。【例1.1】从键盘输入圆的半径,求圆的面积。程序代码如下:/*ex1_1.cpp*#include using namespace std;#define PI 3.14159float sum(float x);void main()float r,s;coutr;s=sum(r);coutr=r s=sendl;float sum(float x)return PI*x*x;1声明区声明区在函数之外。程序的声明区可能需要编写:(1)包含文件,如例1.1中的#include;(2)宏定义,如例1.1中的#define PI 3.14159;(3)函数声明,如例1.1中的float sum(float x);(4)条件编译;(5)全局变量声明;(6)结构体等的定义;(7)类的定义。2函数区一个程序由一个主函数main()和多个(可以是0个 )其他函数组成。每个函数都是由函数声明部分与函数体部分组成。程序的执行从main()函数开始。函数声明部分包括函数返回值类型、函数名、函数的形式参数。函数体部分是用一对花括号括起来的完成该函数所表达的功能的语句的集合。语句可以是数据描述语句或数据操作语句。任何一种程序设计语言可用下面的模型描述:一种程序设计语言的模型与人类的自然语言模型是一致的,都遵守这种模型。读者可以借鉴人类自然语言的学习方法来学习某种程序设计语言。1.2.2 C+程序的书写格式C+程序的书写格式比较灵活,书写程序时可以任意换行,一行内可以书写多条语句,一条语句可以书写在多行上,只要每条语句以分号(;)结束即可。也因为如此,所以C+程序可读性差,为了提高程序的可读性,C+程序的书写格式有如下约定:(1)C+程序中,每行一般书写一条语句;语句较短时,多条语句可书写在一行内。语句较长时,一条语句可写在多行上。(2)C+程序中,每条语句以分号结束,表示一条语句的结束,但函数说明行和声明区的多数语句后不用分号。语句前面没有标号,只有goto语句的转向目标语句前加标号。(3)C+程序中,使用向右缩进方法表达程序中的层次结构,如花括号内的函数体、循环语句的循环体、if语句的if体和else体一般都向右缩进几个字符。花括号是函数体或复合语句的定界符。(4)C+程序中,可使用多行注释或单行注释以增强程序的可读性。多行注释以“/*”开始,以“*/”结束,占据多行。单行注释以“/”开始,占据一行。1.3 一个应用程序的开发过程 1.3.1 Visual C+6.0开发环境 采用Visual C+6.0开发环境;这是一个集编辑、编译、链接、调试运行于一体的集成环境,即在一个程序的控制下可以分步或一次性地完成编辑、编译、链接、调试运行工作。1.3.2 一个应用程序的开发过程 1启动Visual C+6.0开发环境 2创建工程项目 3打开项目文件 4创建C+源程序文件并添加到项目文件中 5编译、链接与运行程序 在上页图中单击“Compile”按钮进行编译,单击“Build”按钮进行编译与链接(在没有编译的情况下),单击“Execute Program”按钮进行编译、链接和运行(在没有编译、链接的情况下)。例1.1程序所建立的项目的运行结果如下:1.4C+的词法规则 一个程序包含两个方面的主要内容:数据描述和数据操作。数据是操作的对象,数据的存储方式决定于该数据的数据类型,描述数据就是定义数据的类型。数据类型的定义表现在常量、变量等的定义之中,而常量、变量又是一种程序设计语言的基本单词。除了常量、变量之外,一种程序设计语言还有标识符、运算符、关键字、分隔符等基本单词,这些单词的构成(书写规则)都必须遵守该语言的词法规则。本节介绍的就是C+中各种单词的构词规则。请读者结合前面的语言模型图学习本节内容并思考本节内容属于语言模型图的哪个环节。由一种语言提供的字符集中的字符构造的单词必须遵守该语言的词法规则。在一种语言中,单词涉及标识符、关键字、运算符、常量、变量、注释符、分隔符等。C+也不例外。本节只讨论C+中的基本词法规则。1.4.1 C+的字符集组成 C+的字符集包括如下字符:(1)26个小写字母:az。(2)26个大写字母:AZ。(3)10个数字:09。(4)标点和特殊字符:+-*/,:;?”|!#%&()空格。(5)空字符:ASCII码为0的字符,用作字符串的结束符。1.4.2 C+的单词及其构词规则 单词由若干个合法字符组成,下面介绍常用的单词。1标识符 标识符是由字母、下画线和数字组成的字符序列,第一个字母必须是字母或下画线,不能是数字。标识符中的字母大小写是不同的。标识符用来命名C+程序中的常量、变量、函数、语句标号及类型定义符等。有一部分标识符是系统定义的。本小节关心的是用户定义的标识符。在定义标识符时,要注意以下几点:(1)要遵守上面的构成标识符的规则。Aa、ABC、A_Y、ycx11、_name是合法标识符。而5xyz、m.x、!abc、x-y是非法标识符。(2)系统已经使用的关键字、函数名或其他已定义的单词不能再定义成标识符。(3)定义标识符时尽可能让标识符有意义,便于阅读,即做到“见名知义”。2关键字关键字(又称保留字)是被系统定义了的已具有特定含义的标识符。3运算符运算符与操作数连接组成表达式。连接一个操作数的运算符称为单目运算符,连接两个操作数的运算符称为双目运算符,连接三个操作数的运算符称为三目运算符。有关运算符的种类、功能、优先级和结合性等问题将在1.7节中详细介绍。4常量常量是在程序中不改变的量。C+程序中的常量有:整型常量、浮点型常量、字符常量和字符串常量4种。将在1.6节中详细介绍。5变量变量是在程序中可以改变的量。变量有三要素:名字、类型和值。某个变量的值被改变后,将一直保持到下一次被改变。变量是一种标识符,其命名完全与标识符相同。将在1.6节中详细介绍其特性。6注释符注释符的作用是在程序中标识注释信息。在C+程序中,可使用多行注释或单行注释增强程序的可读性。多行注释以“/*”开始,以“*/”结束,占据多行。单行注释以“/”开始,占据一行。“/*”、“*/”、“/”就是注释符。7分隔符分隔符有:空格符、换行符、水平制表符等,用作其他单词之间的分隔符;逗号(,),多作多个变量或多个参数之间的分隔符;分号(;),主要用于for语句的for关键字后的圆括号内,作分隔符;冒号(:),用来标识语句标号和开关语句,常用于switch的case关键字后。1.5C+基本数据类型 表1-2 C+基本数据类型基本型(int)短整型(short)长整型(long)无符号整型(unsigned int)无符号短整型(unsigned short int)无符号长整型(unsigned long int)有符号整型(signed int)有符号短整型(signed short int)有符号长整型(signed long int)字符型(char)单精度浮点型(float)双精度浮点型(double)长双精度浮点型(long double)4244244241488-2 147 483 6482 147 483 647-32 76832 767-2 147 483 6482 147 483 64704 294 967 295065 53504 294 967 295-2 147 483 6482 147 483 647-32 76832 767-2 147 483 6482 147 483 6470255-3.410383.41038-1.7103081.710308-1.7103081.710308数 据 类 型字节数数据表达范围1.6 常量与变量 常量与变量是C+中最基本的数据描述形式。本节只介绍常量和变量的基本概念,包括4种常量和基本数据类型的变量。关于构造类型的变量将在后续章节中介绍。1.6.1 常量常量是在程序中不改变的量。C+程序中有4种常量:整型常量、浮点型常量、字符常量和字符串常量。1整型常量C+程序中,整型常量和浮点常量统称数值常量。整型常量有三种形式:十进制、八进制和十六进制。十进制常量的写法就是算术表达方式,如12、345都是合法的十进制常量。八进制常量在数值前要加上一个零(0),如011、077都是合法的八进制常量。十六进制常量的写法是在数值前加上一个零(0)和一个字母X(大小写均可),如0X11、0 xF都是合法的十六进制常量,分别等于十进制数17和15。2浮点型常量浮点型常量又称实数型常量。分为十进制数形式和指数形式两种表示方法。(1)十进制数形式的浮点型常量的书写格式:.其中小数点不能省略。如1.2345、1.0、1.、.12345均是合法的浮点型常量。(2)指数形式的浮点型常量的书写格式:.E其中,指数形式表示符“E”大小写均可。.部分允许不含小数点的,或含小数点的,必须是整数。如12E-3、0.1E2、.12345E6、0E0等均是合法的。【例例1.2】浮点型常量的运用。浮点型常量的运用。程序代码如下:程序代码如下:/*ex1_2.cpp*#include#includeusingnamespacestd;voidmain()intx=77;floata;doubleb;longdoublec;a=88.12300000000000000000f;b=-1.69901234567890123456789e308;c=-1.69901234567890123456789e308;coutx=xendl;couta=setprecision(7)aendl;couta=setiosflags(ios:scientific)aendl;coutsetprecision(20)b=b;couttc=cendl;程序的运行结果如下:3字符常量字符常量是一个用单引号括起来的字符。单引号是字符常量的定界符,单引号本身表示成。在C+中,字符常量具有整数值,其值是该字符的ASCII码。一个字符常量可以与整数进行加减运算。下面的程序给出了字符与整数进行加减运算的实例。【例例1.3】字符常量的运用。字符常量的运用。程序代码如下:程序代码如下:/*ex1_3.cpp*#include#include Using namespace std;void main()char a,b,c,d;a=A;b=B;c=a+3;d=;coutatbtcendl;couthexint(a)tint(b)tint(c)endl;coutdendl;程序的运行结果如下:ABD 414244 4字符串常量字符串常量是用双引号括起来的若干个字符组成的字符序列。双引号是字符串常量的定界符,双引号本身表示成“”。“”是一个空字符串,空字符串中没有任何有效字符,只有一个字符串结束符。在C+程序中,任何一个字符串常量都有一个结束符,该结束符是ASCII码值为0的空字符,表示为0。字符常量与字符串常量是不同的,表现在:(1)表示形式不同。前者用单引号括起来,后者用双引号括起来。(2)存放它们的对象不同。前者存放在字符变量中,后者存放在字符数组或字符指针指定的位置。如,char c=A,s5=ABCD;(3)存放字符串常量时要加一个结束符,而存放字符常量则不需要。所以A与“A”不同。且其占用的内存空间也不同,A占1个字节;“A”占2个字节,前一字节存放字符A,后一字节存放结束符。(4)对它们进行的运算也不同。字符与字符、字符与整数间可作加减运算;而字符串只能作连接运算。【例例1.4】字符串常量的运用。字符串常量的运用。程序代码如下:程序代码如下:/*ex1_4.cpp*#includeusingnamespacestd;voidmain()chars180,s280;couts1s2;couts1ts2endl;程序的运行结果如下:5符号常量符号常量是一个用来替代常量(前面讨论的4种常量)的标识符。这个标识符当然叫符号常量。(1)增强程序的可读性。标识符可以定义得有意义,如用PI表示圆周率。(2)书写简单,不易出错。有的常量直接书写很长,容易出错,如圆周率3.141 592 6用PI代之,既简单又不容易出错。(3)修改程序方便。例如:#define PI 3.1415926#define SIZE 100 1.6.2 变量 变量是在程序中可以改变的量,变量有名字、类型和值三个要素。变量的类型包括存储类和数据类型两个方面。某个变量的值被改变后,将一直保持到下一次被改变。1变量的定义变量在使用前必须定义。格式如下:;例如:int a,b,c;a、b、c为整型变量;缺省存储类,要看是定义在函数体内还是函数体外来确定是自动类还是外部类;static double x,y10;x、y是静态双精度变量,y是数组2变量的数据类型变量的基本数据类型有:整型、浮点型和字符型。变量的构造数据类型称自定义类型。它由若干个数据类型相同或不相同的变量所构成的类型。如数组、结构体、共用体、类都是构造数据类型。3变量的存储类变量的存储类定义变量的有效性范围,即作用域。C+中有4类:自动存储类(auto)、寄存器存储类(register)、静态存储类(static)和外部存储类(extern)。(1)自动存储类某一变量定义成自动存储类后,其作用域在定义它的函数体或分程序内,自动存储类变量只能定义在函数体或分程序内。变量的生存期在作用域内,即执行完定义它的函数后,该变量即被释放。这类变量的安全性最好,在不同的函数中可以定义相同名字的变量,互不影响。在函数体内定义自动存储类变量时可以省去说明符auto。前面程序中定义的变量都省去了存储类说明符auto,它们都是自动存储类变量。(2)寄存器存储类寄存器存储类的变量与自动存储类的变量有相同的作用域和生存期。定义这类变量必须加存储类说明符register,并且只能定义在函数体或分程序内。这类变量有可能被存放在CPU的空闲通用寄存器中,当CPU中没有空闲通用寄存器时,当作自动存储类变量。一旦变量存入CPU的寄存器中,则变量的访问效率将大大提高,这是因为访问内存比访问CPU寄存器花的时间长得多。(3)静态存储类静态存储类分为内部静态存储类和外部静态存储类。内部静态存储类变量定义在函数体或分程序内,其作用域在定义它(们)的函数体或分程序内。而外部静态存储类变量定义在函数体或分程序外,其作用域在定义它(们)的文件内,可见两者的作用域是不同的。内部静态存储类和外部静态存储类变量有相同的生存期,都被存放在内存的静态区域,静态变量在程序结束时才释放内存。要定义静态存储类变量,必须加存储类说明符static。(4)外部存储类外部存储类变量的作用域是整个程序,包含该程序的各个文件。生存期是整个程序,在程序结束时才释放内存。表1-2 各种存储类特性的比较存 储 类 别自动类寄存器类内部静态类外部静态类静态类外部类或分程序内在定义它的文件内程序的各个文件程序结束前有效离开定义体即消失存取速度快安全性好在定义它的函数体安全性差同自动类作 用 域生 存 期其 他外部存储类变量可以定义在函数体内、外,定义在函数体外时可以不加存储类说明符,但在说明一个外部存储类变量时,必须加存储类说明符extern。有如下两种情况要在引用外部存储类变量前,对其进行说明。在一个文件中,在定义前引用外部存储类变量必须说明。在多个文件的程序中,在一个文件中定义,在另一个文件中引用,引用前要说明。【例例1.5】定定义义在在前前、引引用用在在后后的的外外部部存存储储类类变变量量(输输出出结结果果与与例例1.4类似)。类似)。程序代码如下:程序代码如下:/*ex1_5.cpp*#includeusingnamespacestd;chars180,s280;voidmain()couts1s2;couts1ts2endl;【例1.6】定义在后、引用在前的外部存储类变量(输出结果与例1.4类似)。程序代码如下:/*ex1_6.cpp*#includeusingnamespacestd;voidmain()externchars180,s280;/说明外部存储类变量说明外部存储类变量couts1s2;couts1ts2endl;chars180,s280;4变量的值变量的值是变量三要素之一。可以在定义变量时对变量赋初值(变量初始化),也可以在引用变量时通过其他方法(赋值表达式、cin、scanf函数等)对变量赋值。变量初始化格式:=,=,;如果外部类和静态类变量不进行初始化,那么它们由编译程序赋以“零值”(数值型变量赋数值0,字符型变量赋空字符)。如果自动类和寄存器类变量不进行初始化,那么它们不具有有意义的值,必须通过赋值后才能引用。外部类和静态类变量初始化是在编译时给定的。即在第一次执行定义或说明时给定,以后进入所定义的函数体或分程序不再赋初值。而自动类和寄存器类变量的初始化是在每次进入函数体或分程序时重新定义初值。可见,变量有定义和引用两个方面。变量的定义涉及变量名称、存储类和数据类型。引用即使用,通常先定义,后使用。例1.6是特例,但在使用前必须说明。引用一个变量,其值是否有意义是一个重要的问题。如在一个函数内定义内部静态存储类的变量,离开这个函数后,虽然变量仍然存在,但它的值可能无效了,所以不能引用。下面是一些合法的定义:int a=1,b=2,c=3;static char xyz=A,buffer10=Hello;double a5=1.12345,2.23456,3.34567,4.45678,5.56789float s=1+2+3;关于在引用变量时通过赋值表达式、cin、scanf函数等方式对变量赋值,在前面的实例中已大量使用。值得一提的是赋值表达式,在下面的程序段中:int a;a=12;“a=12”是一个赋值表达式。C+允许表达式当作语句使用,其后要加分号,所以“a=12;”是赋值表达式语句。“a=12”这个表达式有双重意义:表达式“a=12”具有12的值,另外表达式“a=12”的副作用使变量a具有12的值。给变量赋值正是利用了这种副作用。这是C+与其他高级程序设计语言不同的地方,其他语言称“a=12”是赋值语句。1.7 运算符与表达式 C+的表达式包括算术表达式、关系表达式、逻辑表达式、赋值表达式、条件表达式和逗号表达式。C+的类型转换包含隐含转换和强制转换两种方法。任何表达式后加“;”构成表达式语句。1.7.1 算术运算符与算术表达式 1算术运算符算术运算符有:(1)单目运算符:-(取负)、+(增1)、-(减1)。(2)双目运算符:+(加)、-(减)、*(乘)、/(除)、%(取余)。单目运算符的优先级高于双目运算符的优先级,双目运算符中的*、/、%的优先级高于+、-的优先级。+(增1)运算可写在变量前或变量后,分别称作前缀运算和后缀运算。如果定义一个变量i,前缀运算记为:+i,后缀运算记为:i+。这样形成了前缀运算表达式+i和后缀运算表达式i+,在C+中,两个表达式都对变量i进行增1运算,这是此两类表达式的副作用。但把两个表达式分别赋给变量a和b时,则a和b取不同的结果(见例1.7和例1.8)。【例例1.7】前缀前缀,后缀运算表达式的运用。后缀运算表达式的运用。程序代码如下:程序代码如下:/*ex1_7.cpp*#includeusingnamespacestd;voidmain()inti=10,a,b,j=i+10,x,y;/初值可初值可以是包含有值的变量的表达式以是包含有值的变量的表达式a=+i;couta=ati=iendl;/注意本注意本行语句与下行语句的位置行语句与下行语句的位置b=i+;coutb=bti=iendl;x=-j;coutx=xtj=jendl;y=j-;couty=ytj=jendl;程序的运行结果如下程序的运行结果如下:取取余余运运算算只只能能用用于于两两个个整整型型数数的的运运算算。功功能能是是求求两两个个整整型型数数相相除除的的余余数。用下面的公式:余数数。用下面的公式:余数=被除数被除数-商商除数除数注意:注意:5%-3=2,而,而-5%3=-2。【例例1.8】取余运算。取余运算。程序代码如下:程序代码如下:/*ex1_8.cpp*#includeusingnamespacestd;voidmain()inta,b;a=5%-3;b=-5%3;couta=atb=b(大于)=(大于等于)=(等于)!=(不等于)前4个关系运算符的优先级高于后2个。关系运算符是双目运算符。一个关系运算符的两边都需要操作数,操作数是算术表达式。关系运算的结果在C+中是整型值,关系成立时,结果为1,否则为0。在这一点上与其他程序语言不同,其他程序语言的关系表达式值是逻辑值。C+关系表达式的值可以参与整型运算。关系运算的结合性是从左至右。2关系表达式关系表达式是由关系运算符把算术表达式连接起来的式子。它在C+程序中通常用作条件。使用关系表达式应注意两个问题:(1)关系表达式的值为整型数据。(2)在数学中,y0时,表达式“x+yx”是永真的。但在用计算机语言判断关系表达式“x+yx”时,可能会得出不真的结论。这种情况往往出现在x和y两个数差别很大,一个很大,另一个则小到了语言表达精度以下,以致这个很小的数对相加结果不产生影响。【例1.9】关系表达式的运用。程序代码如下:/*ex1_9.cpp*#define EPS 1.0E-16#include using namespace std;void main()double x,y;bool z;x=5.0;y=EPS;z=x+yx;coutx=xty=ytz=zendl;程序的运行结果如下程序的运行结果如下:1.7.3 逻辑运算符与逻辑表达式1逻辑运算符在C+中,逻辑运算符有以下几种:!:逻辑求反(又称逻辑非,单目运算符)&:逻辑与(双目运算符)|:逻辑或(双目运算符)逻辑运算符的优先级从高到低依次是:!、&、|。逻辑运算符的结合性是从左至右(单目除外)。2逻辑表达式逻辑表达式是由逻辑运算符与操作数组成的式子。C+规定:逻辑表达式中非0的操作数为真,0操作数为假。这说明C+的逻辑运算符的操作数可以是算术表达式、关系表达式、逻辑表达式。这与其他程序语言不同。逻辑运算的结果为真时用1表示,为假时用0表示。逻辑运算结果的类型也是整型。【例1.10】逻辑表达式的运用。程序代码如下:/*ex1_10.cpp*#include using namespace std;void main()int a,b,c,d;bool e;a=5;b=0;c=!b;d=a&b;e=a|b;coutatbtctdte:右移位运算符:左移位运算符都是双目运算符,优先级相同,高于逻辑位运算符优先级。移位运算符左边是要移位的操作数,右边是要移位的位数。移位运算表达式写为:或:右移位操作是将操作数化成二进制数,将操作数右移指定位数,移出的二进制位丢弃,左边补0或符号位(根据编译决定)。左移位操作是将操作数化成二进制数,将操作数左移指定位数,移出的二进制位丢弃,右边补0。【例例1.11】逻辑位运算和移位运算。逻辑位运算和移位运算。程序代码如下:程序代码如下:/*ex1_11.cpp*#includeusingnamespacestd;voidmain()inta,b;a=13;b=8;couta=ata=aendl;couta&b=(a&b)endl;coutab=(ab)endl;couta|b=(a|b)endl;cout2=2)endl;couta2=(a2)endl;cout2=2)endl;程序的运行结果如下:1.7.5 赋值运算符与赋值表达式1赋值运算符赋值运算符有11种,均为双目运算符,优先级仅高于逗号运算符,结合性是从右至左。11种赋值运算符中有1个基本赋值运算符,10个复合赋值运算符,分别为:(1)=:基本赋值运算符(2)+=:加赋值运算符(3)-=:减赋值运算符(4)*=:乘赋值运算符(5)/=:除赋值运算符(6)%=:取余赋值运算符(7)&=:位与赋值运算符(8)=:位异或赋值运算符(9)|=:位或赋值运算符(10)=:位右移赋值运算符2赋值表达式赋值表达式是由赋值运算符与操作数组成的式子。对应11种赋值运算符有相应的11种赋值表达式。先介绍基本赋值表达式,书写为:=上句在C+中称赋值表达式。在C+中允许表达式构成语句,只要在赋值表达式后面加上“;”,即:=;赋值表达式执行的结果使赋值表达式本身具有一个值,就是赋值运算符(=)右边表达式的值。还有一个副作用:使赋值运算符(=)左边的变量具有右边表达式的值。前面的所有实例中出现的赋值表达式正是利用这种副作用对变量赋值。可以通过下面的实例理解赋值表达式具有值这一概念。【例例1.12】赋值表达式的值及其副作用。赋值表达式的值及其副作用。程序代码如下:程序代码如下:/*ex1_12.cpp*#includeusingnamespacestd;voidmain()intc=1,a,b;coutc=cendl;a=b=c=10;couta=atb=btc=cta=b=c=10=(a=b=c=10)endl;couta+=2=(a+=2)endl;a+=a;couta=aendl;程序的运行结果如下程序的运行结果如下:其他复合赋值运算符组成复合赋值表达式的形式类似基本赋值表达式,表达形式如下:+=等价于 =+-=等价于 =-*=等价于 =*/=等价于 =/%=等价于 =%&=等价于 =&=等价于 =|=等价于 =|=等价于 =等价于 =复合赋值表达式比基本赋值表达式书写简单、编译时生成的目标代码少,因而运行效率高。使用赋值表达式应注意以下问题:(1)可以使用赋值表达式连续赋值。例如:int a,b,c;a=b=c=1;表达式a=b=c=1使3个变量均拥有值1。由于赋值运算符的结合性是从右至左,所以变量c和表达式c=1先拥有值1,然后变量b和表达式b=c=1拥有值1,最后才是变量a和表达式a=b=c=1拥有值1。(2)使用赋值表达式多用来改变变量的值,赋值表达式本身的值用得少。在赋值表达式中,赋值运算符左边的变量称左值,右边的表达式称右值。计算时,先计算右值,再转换其类型为与左值相同的类型,将右值赋给左值,同时赋值表达式具有右值的值。右值类型转换过程是自动完成的,但转换时有数据精度损失。1.7.6 三目运算符与三目条件表达式在C+中只有一个三目运算符?:,三目条件表达式格式如下:?:先计算,当非0时,三目条件表达式取的值,否则取的值。三目条件表达式的功能可以解释成一个简单的条件语句(参见第2章)。三目运算符?:的结合性是从右至左。【例例1.13】三目条件表达式的运用。三目条件表达式的运用。程序代码如下:程序代码如下:/*ex1_13.cpp*#includeusingnamespacestd;voidmain()inta=1,b=2,c=3;coutab?a:b=(ab?a:b)endl;coutb?b-:+a=b?b-:+a)endl;coutb?+a:+b=b?+a:+b)endl;coutb?a:bc?b:c=b?a:bc?b:c)endl;程序的运行结果如下:ab?b-:+a=2 c+=ab?+a:+b=6ab?a:bc?b:c=6 程序中有4个cout语句,第1个cout语句输出三目条件表达式的值,显然是1。在第2个cout语句中,三目条件表达式的值取+a的值,结果是2。因为ab为0,b-并没有执行,故b的值仍然是2。第2个cout语句已修改了变量a的值,使a=2。在第3个cout语句中,由于三目运算符的优先级高于赋值运算符,所以先计算三目条件表达式ab?+a:+b,由于ab为0,所以三目条件表达式取+b的值,结果是3;再计算赋值表达式c+=3,结果是6。此行cout语句修改了b、c两变量的值,使b=3、c=6。在第4个cout语句中,由于三目运算符是从右结合的,所以先计算bc?b:c,结果为6;再计算ab?a:6,结果为6。1.7.7 逗号运算符与逗号表达式逗号在C+中可以作为分隔符或运算符。逗号运算符为双目运算符,它的优先级最低,结合性是从左至右。逗号运算符用来连接两个或两个以上的表达式,形成逗号表达式。计算逗号表达式时,从左至右依次计算各个表达式,逗号表达式的值取最后一个表达式的值。多用在for循环语句的for关键字后的圆括号内,圆括号内由分号分隔的表达式可以是逗号表达式。注意例1.15中倒数第二行的输出结果。【例例1.14】逗号表达式的运用。逗号表达式的运用。程序代码如下:程序代码如下:/*ex1_14.cpp*#includeusingnamespacestd;voidmain()inta=1,b=2,c=3;couta=atb=btc=cendl;c=(a=10,b=a*2,b*2);couta=atb=btc=cendl;couta,b,c,c*3=(a,b,c,c*3):用于结构体、共用体变量。(4)sizeof:计算一数据类型或一表达式占用内存的字节数。例如,sizeof(int)或 sizeof()(5)强制类型:作用于一表达式,使表达式的类型强制性转换为指定类型。例如,(int)(a+b+1.234567)C+的优先级和结合性比较复杂,通过下面的总结,可以记住:除最高级和最低级外,其他运算符的优先级是“一二三赋值”。最高级是圆括号、下标、点、箭头;最低级是逗号。“一二三赋值”分别指单目、双目、三目、赋值运算符,它们的优先级也是按此顺序。这样分出了6大类优先级。在双目运算符中,有10级,顺序是:算术(除求负值运算外分2级)、移位、关系(分2级)、逻辑位(除按位取反运算外分3级)、逻辑(除逻辑非运算外分2级)。单目、三目、赋值运算符的结合性是从右至左,其他运算符的结合性是从左至右。【例例1.15】运算符的优先级和结合性。运算符的优先级和结合性。程序代码如下:程序代码如下:/*ex1_15.cpp*#includeusingnamespacestd;voidmain()intx,y,z;x=!-5+312;y=x-(-1);coutx=xty=yendl;z=xy?x-y?x:y:x*y;coutsizeof(int)=sizeof(int)tsizeof(z)=sizeof(z)endl;coutx=xty=ytz=z2;的计算顺序是:第一步先计算单目运算,单目运算有两个:!和-,按从右至左的结合性,先计算-5,再计算!(-5),结果为0;第二步计算算术运算0+31;第三步计算右移运算,结果为7,即x=7。语句y=x-(-1);中间有三个-,前两个是减1单目运算,后一个是算术减运算。计算顺序是:第一步计算x-,使x=6,这是减1表达式的副作用,并不计算在y=x-(-1);语句中,所以语句y=x-(-1);变为y=7-(-1),结果使y=8。这时要注意x的值因为副作用发生了变化,即x=6。所以在第一条cout语句输出时x=6、y=8。语句z=xy?x-y?x:y:x*y;中有单目运算,先计算之,-y的结果表明为7,故语句变成z=xy?x7?x:y:x*y;,语句中有两个三目表达式,三目表达式中的“?”和“:”分别相当于前圆括号“(”和后圆括号“)”,成对出现。按从右至左的结合性,先找最右边的“?”,再找与之最近匹配的“:”,得其表达式为:x7?x:y,结果取x的值6。从而整个语句变成z=xy?6:x*y;,所以z=6。在这条语句中,x的值没改变,y的值变为7,故在第三条cout语句输出时x=6、y=7、z=6。1.7.10 类型转换C+的数据类型转换灵活,表现在它的许多数据类型之间具有自动(隐含)转换功能,当然也可以使用强制类型转换功能。(1)隐含自动转换,从低类型向高类型转换char型和short型自动转换为int型;unsigned char型和unsigned short型自动转换为unsigned型;float型自动转换为double型。(2)在各类数值型数据进行混合运算时,系统自动将参与运算的各类数据类型转换为它们之间数据类型最高的类型。在C+中,数据类型从低到高的类型顺序为:int(short,char)unsigned(unsigned short,unsigned char)longdouble(float)(3)在赋值表达式中,系统自动将赋值运算符右边的表达式的数据类型转换为左边变量的类型。在这种转换中,从低类型向高类型的转换是保值的,从高类型向低类型的转换是不保值的(即转换有数据精度损失)。(4)强制转换格式是:()使表达式的类型强制转换成说明的数据类型。强制转换可能是不保值的。强制转换是一次性的,例如:int x=1,y=2,z=3;coutsizeof(double)(x*y*z);第二行语句中,表达式强制为double型,下次再出现表达式x*y*z时,又是整型。【例例1.16】类型转换。类型转换。程序代码如下:程序代码如下:/*ex1_16.cpp*#includeusingnamespacestd;voidmain()intx=1,y=2,z=3;doublex1=1.234567;doubley1;cout混合表达式占用字节数混合表达式占用字节数:sizeof(x+y+z+x1)endl;cout赋值表达式占用字节数赋值表达式占用字节数:sizeof(y1=x+y+z+A)endl;cout强制成强制成int型占用字节数型占用字节数:sizeof(int)(x1*2)endl;coutx1*2=x1*2endl;coutsizeof(x1*2)=sizeof(x1*2)endl;cout强制成强制成int型后型后,x1*2=(int)(x1*2)endl;程序的运行结果如下:混合表达式占用字节数:8赋值表达式占用字节数:8强制成int型占用字节数:4x1*2=2.46913sizeof(x1*2)=8强制成int型后,x1*2=2C+程序设计(第二版)106第第2章章程序控制结构程序控制结构2.1顺序结构顺序结构2.2选择结构选择结构2.3循环结构循环结构2.4控制转向语句控制转向语句2.5程序实例程序实例 107v按照语句出现的先后顺序依次执行。按照语句出现的先后顺序依次执行。2.1顺序结构顺序结构 语句1语句2图2.1顺序结构流程图1082.1.1定义语句定义语句v说明语句说明语句v在在C+程序中,一个标识符(变量名、常量名、函程序中,一个标识符(变量名、常量名、函数名、对象名等)在使用之前必须先定义,通知编数名、对象名等)在使用之前必须先定义,通知编译器为其分配存储空间,或告诉编译器它的存在及译器为其分配存储空间,或告诉编译器它的存在及其特征。其特征。v例如:例如:int x=1,y=2;const double PI=3.14159;float score303;1092.1.2表达式语句表达式语句v形式:形式:;v可以进行的操作通常包括赋值操作,复合赋值可以进行的操作通常包括赋值操作,复合赋值操作,增量、减量操作,函数调用操作和输入操作,增量、减量操作,函数调用操作和输入输出操作。输出操作。v例如:例如:n+;-m;abs(x);cinxy;coutx+y;s=x+y;m=n=t;a=10,b=20;z*=w;1102.1.3复合语句复合语句v形式:形式:v作用:当程序中某个位置在语法上只允许一条作用:当程序中某个位置在语法上只允许一条语句,而在语义上要