《基本数据类型与表达式.ppt》由会员分享,可在线阅读,更多相关《基本数据类型与表达式.ppt(85页珍藏版)》请在金锄头文库上搜索。
1、第二章 程序的数据描述(I)基本数据类型与表达式主讲人:侯海良通信与控制工程系主要内容n n数据类型的概念n nC+基本数据类型n n常量与变量n n操作符n n表达式n n控制台的输入/输出数据类型n n数据是程序的一个重要组成部分,数据的描述用数据类型来给出,每个数据都属于某种数据类型。n n一种数据类型可以看成由两个集合构成:值集:描述了该数据类型包含哪些值(包括这些值值集:描述了该数据类型包含哪些值(包括这些值的结构)。的结构)。操作(运算)集:描述了对值集中的值能实施哪些操作(运算)集:描述了对值集中的值能实施哪些运算。运算。例如:例如:整数类型整数类型就是一种数据类型,它的值集就是
2、就是一种数据类型,它的值集就是由整数所构成的集合,它的操作集包括:加、减、由整数所构成的集合,它的操作集包括:加、减、乘、除等运算。乘、除等运算。n n数据类型一般可以分为:简单数据类型简单数据类型:值集中的数据是不可再分解的:值集中的数据是不可再分解的简单数据,如:整数类型、实数类型等;简单数据,如:整数类型、实数类型等;复合数据类型复合数据类型:值集中的数据是由其它类型的:值集中的数据是由其它类型的数据按照一定的方式组织而成,如:向量、矩数据按照一定的方式组织而成,如:向量、矩阵等。阵等。 n n区分数据类型的好处对数据进行分类,便于数据的处理。对数据进行分类,便于数据的处理。提高程序的可
3、靠性,便于编译程序自动进行类提高程序的可靠性,便于编译程序自动进行类型一致性检查。型一致性检查。便于产生高效代码便于产生高效代码C+数据类型n nC+把数据类型分为:基本数据类型基本数据类型n nC+C+语言预先定义好的数据类型,常常又称为语言预先定义好的数据类型,常常又称为标准数标准数据类型据类型或或内置数据类型内置数据类型(built-in typesbuilt-in types),它们都是),它们都是简单类型。简单类型。构造数据类型构造数据类型n n用户利用语言提供的用户利用语言提供的类型构造机制类型构造机制从其它类型构造出来从其它类型构造出来的数据类型,它们大多为复合数据类型(枚举类型
4、除外)的数据类型,它们大多为复合数据类型(枚举类型除外)。抽象数据类型抽象数据类型n n用户利用用户利用数据抽象机制数据抽象机制把数据与相应的操作作为一个整把数据与相应的操作作为一个整体来描述的数据类型。它们一般为复合数据类型。体来描述的数据类型。它们一般为复合数据类型。 C+基本数据类型n nC+基本数据类型指的是语言预定义的数据类型,称为标准或内置数据类型n nC+基本数据类型对应着能由计算机直接表示和处理(机器指令能对它们直接进行操作)的数据类型,包括: 整数类型整数类型 实数类型实数类型 字符类型字符类型 逻辑类型逻辑类型 空值类型空值类型 1 整数类型n n整数类型用于描述通常的整数
5、。采用整数类型用于描述通常的整数。采用二进制补码二进制补码 存储;存储;根据精度分成:根据精度分成: intint short short intint或或shortshort long long intint或或longlongn n编译器的机器字长总是与整型的位长有关如:编译器的机器字长总是与整型的位长有关如:3232位位编译器的整型数一定为编译器的整型数一定为3232位长。位长。一般情况下,一般情况下,“ “short short intint” ”的范围的范围 “ “intint” ”的范围的范围 “ “long long intint” ”的范围的范围 short short int
6、int占占2 2个字节(个字节(-32768-327683276732767) long long intint占占4 4个字节(个字节(-2147483648-214748364821474836472147483647) intint占占2 2个或个或4 4个字节(个字节(VCVC中为中为4 4字节)字节) 超过表示范围的整型数其值不可预料或者出错超过表示范围的整型数其值不可预料或者出错 如:如:intint a = 12345678912345678912345; / a = 12345678912345678912345; / 错错1.1 无符号整数类型n n为了能对正整数进行单独表示
7、,C+提供了无符号整数类型:unsigned unsigned intint或或unsignedunsignedunsigned short unsigned short intint或或unsigned shortunsigned shortunsigned long unsigned long intint或或unsigned longunsigned longn n它们所占的内存大小与相应的有符号整数类型相同,但所表示的最大正整数比相应的有符号整数类型所表示的最大正整数要大(大约一倍)。n n整数类型数据在计算机内部通常用2的补码表示:正整数的补码为它的二进制原码表示正整数的补码为它的二
8、进制原码表示负整数的补码为把相应正整数的二进制表示中负整数的补码为把相应正整数的二进制表示中各个二进制位取反后得到的整数加各个二进制位取反后得到的整数加1 1n n例如:如果用一个字节存储整数类型数据,则,1212的补码为:的补码为: 0000110000001100-12-12的补码为:的补码为:1111010011110100。1.2 整数类型的内部表示n n用补码表示整型数便于加、减运算,特别地,减法可以转换成加法来做。例如: 5 5 加加 -2-2 00000101 (5 00000101 (5的补码的补码) )+ 11111110 (-2+ 11111110 (-2的补码的补码) )
9、 1 100000011 (3)00000011 (3) 2 2 减减 8 8 = 2 = 2 加加 -8 -8 00000010 (2 00000010 (2的补码的补码) )+ 11111000 (-8+ 11111000 (-8的补码的补码) ) 11111010 (-6) 11111010 (-6)整型数的操作:+,-,*,/,%,=,!,=,=,=,&,|,&=,|=,&,|,&=,|=,!=,=,+=,-=,*=,/=,%=,+,-,,,? :2 实数类型n n实数类型又称浮点型,它用于描述通常的实数。包括: float float (单精度型)(单精度型) double doub
10、le (双精度型)(双精度型) long doublelong double(长双精度型)(长双精度型)n n一般情况下“ “float”float”的范围的范围 “ “double”double”的范围的范围 “ “long double”long double”的的范围范围floatfloat占占4 4个字节(个字节( 3.4103.4103838 )doubledouble占占8 8个字节(个字节( 1.7101.710308308 )long doublelong double占占8 8个或者个或者1010个字节(个字节(VCVC为为8 8个)个)2.1 实数类型的内部表示n n在计算
11、机内部,实数表示成:a2ba a:尾数:尾数(Mantissa)(Mantissa),b b:指数:指数(Exponent)(Exponent),它们,它们均为二进制形式。均为二进制形式。存储实数前首先需要对其进行规格化,即把尾数存储实数前首先需要对其进行规格化,即把尾数调整为调整为1.xxx.1.xxx.形式,其中的整数位形式,其中的整数位“ “1”1”和小数和小数点不存储。例如,点不存储。例如,n n对于实数对于实数12.512.5,经过下面的规格化之后,经过下面的规格化之后,12.5 = (1100.1)12.5 = (1100.1)2 2 = (1. = (1.10011001) )2
12、 2223 3 n n存储的是:存储的是:10011001(尾数)和(尾数)和3 3(指数,存储时将转(指数,存储时将转化成某种二进制形式)两个部分化成某种二进制形式)两个部分3 字符类型n n字符类型用于描述文字类型数据中的一个字符。字字符类型用于描述文字类型数据中的一个字符。字符在计算机中存储的是它的编码。符在计算机中存储的是它的编码。 charchar:表示单子节编码的字符。:表示单子节编码的字符。 wchar_twchar_t:表示多字节编码的字符。:表示多字节编码的字符。n n字符型可以看成整型数的子集,字符型可以看成整型数的子集,表示范围:表示范围: 有符号:有符号:-128-12
13、8127 127 无符号:无符号:0 0255255 输出形式与整型数不同输出形式与整型数不同: : intint a = 65; a = 65; char b = 65; char b = 65; coutcoutaa“ “nn” ”; ; coutcoutbb false0 - false非非0 - true0 - true5 空值类型n n在C+中提供了一种值集为空的类型:空值型(void),用以表示:没有返回值的函数的返回类型没有返回值的函数的返回类型通用指针类型(通用指针类型(void *void *):任何类型的数据):任何类型的数据指针都可以赋给指针都可以赋给voidvoid类型
14、的指针类型的指针sizeofn n可以通过“sizeof(类型名)”或“sizeof(变量名)”来计算各种数据类型的数据所占的内存空间大小(字节数) 。n n标准库的头文件climits(或limits.h)定义了所有整型的取值范围,n n标准库的头文件cfloat(或float.h)定义了所有实数类型的取值范围。n nVC中各种基本数据类型所占的字节数计算typedef n nC+允许在程序中给已有数据类型取一些别名,格式为: typedef ; n n例如:typedeftypedef unsigned unsigned intint UintUint; ;unsigned unsigne
15、d intint x; x; UintUint x; x; 注意:n ntypedef并没有定义新类型,只是给已有的类型取个别名而已。n n使程序简明、清晰和易于修改。其作用是便于程序的阅读和编写。数据在C+程序中的表示n n在程序中,数据以两种形式出现:常量常量:用于表示在程序执行过程中不变(或不:用于表示在程序执行过程中不变(或不能被改变)的数据,如:能被改变)的数据,如:n n圆周率圆周率 :3.14159263.1415926n n一个星期的天数:一个星期的天数:7 7变量变量:用于表示在程序执行过程中可变的数据,:用于表示在程序执行过程中可变的数据,如:计算圆的周长如:计算圆的周长2
16、*PI*r2*PI*r中的半径中的半径r r,它可能,它可能在程序运行时从用户处得到,或由程序的其它在程序运行时从用户处得到,或由程序的其它部分计算得到。部分计算得到。常量n n在C+程序中,常量可以用两种形式表示:字面常量字面常量:在程序中通过直接写出常量值来使用:在程序中通过直接写出常量值来使用的常量,通常又称为的常量,通常又称为直接量直接量(literalliteral)。)。符号常量符号常量(命名常量):通过常量定义给常量取(命名常量):通过常量定义给常量取一个名字并指定一个类型,在程序中通过常量名一个名字并指定一个类型,在程序中通过常量名来使用这些常量。来使用这些常量。 字面常量(直
17、接量)n nC+的字面常量有:整数类型常量整数类型常量实数类型常量实数类型常量字符类型常量字符类型常量字符串常量字符串常量整数类型字面常量n n在C+程序中,整数类型常量可以用下面形式来书写:十进制十进制。由。由0909数字组成,第一个数字不能是数字组成,第一个数字不能是0 0(整数(整数0 0除外),如:除外),如:n n5959,128128,-72-72八进制八进制。由数字。由数字0 0打头,打头,0707数字组成,如:数字组成,如:n n073073,02000200,-0110-0110十六进制十六进制。由。由0x0x或或0X0X打头,打头,0909数字和数字和AFAF(或(或afa
18、f)字母组成,如:)字母组成,如:n n0x3B, 0x80, -0x480x3B, 0x80, -0x48n n整数类型字面常量的类型为int。可在整数类型常量的后面:加上加上l l或或L L,表示,表示long long intint类型的常量,如:类型的常量,如:32765L 32765L 也可加上也可加上u u或或U U,表示,表示unsigned unsigned intint类型的常类型的常量,如:量,如: 4352U 4352U 也可同时加上也可同时加上u u(U U)和)和l l(L L)表示)表示unsigned unsigned longlong类型的常量,如:类型的常量,
19、如:41152UL41152UL或或41152LU 41152LU 实数类型字面常量n n在C+程序中,实数类型常量采用十进制形式书写。实数类型常量有两种表示法:小数表示法小数表示法:由整数部分、小数点:由整数部分、小数点“ “.” .”和小数部和小数部分构成,如:分构成,如:456.78, -0.0057456.78, -0.0057,5.5.,.5.5科学表示法科学表示法:在小数表示法或整数后加上一个指:在小数表示法或整数后加上一个指数部分,指数部分由数部分,指数部分由E(E(或或e)e)和一个整数类型数构和一个整数类型数构成,表示基数为成,表示基数为1010的指数,如:的指数,如:4.5
20、678E2, -4.5678E2, -5.7e-35.7e-3等。等。n n实数类型字面常量为double型。可以在实数类型常量后面加上加上F(fF(f) )以表示以表示floatfloat型,如:型,如:5.6F5.6F。也可加上也可加上L(lL(l) )表示表示long doublelong double型,如型,如5.6L5.6L。字符类型字面常量n n在C+程序中,字符常量是由两个单引号()括起来的一个字符构成,其中的字符写法可以是:字符本身,如:A转义序列,由打头的一串符号n n字符的编码,如:字符的编码,如: AA的表示的表示 八进制:八进制: dddddd ,如:,如:10110
21、1 十六进制:十六进制: xhhxhh ,如:,如:x41x41n n特殊表示,如:特殊表示,如:nn(换行符)、(换行符)、rr(回车(回车符)、符)、tt(横向制表符)、(横向制表符)、bb(退格符)(退格符)等等n n注意下列字符的表示:反斜杠(反斜杠( )应写成:应写成:单引号(单引号( )应写成:)应写成:双引号(双引号( )可写成:)可写成:或或 字符串类型字面常量n n在C+程序中,字符串常量是由两个双引号(“ ”)括起来的字符序列构成,其中的字符的写法与字符类型常量基本相同,即可以是字符本身和转义序列。如:This is a string.This is a string. I
22、m a student.Im a student. Please enter Y or N:Please enter Y or N:This is two-line This is two-line nmessagenmessage! ! n n存储字符串时,继承了C语言的串的特点,往往要在最后一个字符的后面存储一个字符0,表示字符串结束,称为C-串; 知道了知道了C-C-串首地址串首地址, ,即可知道整个即可知道整个C-C-串串, ,所所以可以藉字符首址以可以藉字符首址( (字符指针字符指针) )来操作串来操作串, ,但要但要注意,注意,C-C-串的第一个字符与整个串的第一个字符与整个C-C
23、-串的操作不串的操作不同同, ,如如, , 串的输出操作串的输出操作: : char* char* strstr = ”Hello”; = ”Hello”; coutcout * *strstr endlendl; / ; / 显示显示显示显示H H coutcout strstr endlendl; / ; / 显示显示显示显示HelloHellostrstr* *strstrHello!0C-C-串结构串结构C-串不能直接比较,因为字符指针的比较只是地址值的比较而不是串的字典序比较: coutcout(“join”=”join” ? ” : ”not “)”equaln”; / (“joi
24、n”=”join” ? ” : ”not “)”equaln”; / 字字面值比较面值比较 charchar* str1=”good”;* str1=”good”; charchar* str2=”good”;* str2=”good”; coutcout(str1=str2 ? ” : ”not “)”equaln”; / (str1=str2 ? ” : ”not “)”equaln”; / 字字符指针比较符指针比较 charchar buffer16=”Hello”; buffer16=”Hello”; charchar buffer26=”Hello”; buffer26=”Hello
25、”; coutcout(buffer1=buffer2 ? ” : ”not “)”equaln”; / (buffer1=buffer2 ? ” : ”not “)”equaln”; / 字符数组比较字符数组比较 结果:结果:结果:结果: not equalnot equal not equal not equal not equal not equal不得不配备专门操作C-串的库函数string.h:n nstrcpy(s1, s2); strcpy(s1, s2); /从从从从s2s2拷贝到拷贝到拷贝到拷贝到s1s1n nstrcmp(s1, s2); strcmp(s1, s2); /
26、比较比较比较比较s1s1与与与与s2s2n nstrcat(s1, s2); strcat(s1, s2); /连接连接连接连接s2s2到到到到s1s1n nstrrev(sstrrev(s); ); /将将将将s s倒排倒排倒排倒排 n nstrset(sstrset(s, c); , c); /将将将将s s全置为全置为全置为全置为c cn nstrstr(sstrstr(s, “ell”); , “ell”); /查找查找查找查找s s中的子串中的子串中的子串中的子串n nstrchr(s,cstrchr(s,c); ); /查找查找查找查找s s中字符中字符中字符中字符c c的位置的位
27、置的位置的位置n nstrlen(sstrlen(s) ) /计算串计算串计算串计算串s s的实际长度的实际长度的实际长度的实际长度 等等等等等等等等但字符指针操作C-串的安全性受到质疑:char* str1;char* str1;char* str2 = new char5;char* str2 = new char5;strcpy(str2, ”ugly”);strcpy(str2, ”ugly”);strcpy(str1,str2); / strcpy(str1,str2); / 错错: str1: str1没有空间可储没有空间可储strcpy(str2, ”Hello”); / str
28、cpy(str2, ”Hello”); / 错错: str2: str2空间不够大空间不够大str2 = ”Hello”; / str2 = ”Hello”; / 错:原来的错:原来的” ”ugly”ugly”空间脱钩,导空间脱钩,导致内存泄漏致内存泄漏根源:复制操作须以足够的目的地空间为前提,而所有串操作的根源:复制操作须以足够的目的地空间为前提,而所有串操作的空间调配都是人为安排的,串库函数一概不管空间调配都是人为安排的,串库函数一概不管C-串和String流操作n n采用C-串完成串的复制等基本操作 程序及结果n n采用string流进行上述相应的操作 程序及结果 a.replace(0
29、,9,9,c):a串从0到9的前9个字符替换为cn n说明:采用string串方式操作更简便,并可以直接进行运算和比较,操作的空间调配不需要人为安排的stringstring流对文件的操作:流对文件的操作: 将将stringstring实体看作是一个输入设备进行文件的读写实体看作是一个输入设备进行文件的读写例:如果一个文件例:如果一个文件aaa.txtaaa.txt,有若干行,每行中含有不知道几,有若干行,每行中含有不知道几个的整数,每行的整数和输出并写入文件个的整数,每行的整数和输出并写入文件bbb.txtbbb.txt:n n#include #include / /输入输出流头文件输入输
30、出流头文件n n#include #include / /文件流头文件文件流头文件n n#include #include / /包含包含string.hstring.h的头文件的头文件n nusing namespace std; using namespace std; n nvoid main()void main()n n ifstream in(“aaa.txt”);ifstream in(“aaa.txt”); ofstreamofstream out(“bbb.txtout(“bbb.txt”)”); ;n n for (string s;getline(in,s); ) for
31、 (string s;getline(in,s); )n n int a,sum=0; int a,sum=0;n n for (istringstream sin(s);sina;sum+=a); for (istringstream sin(s);sina;sum+=a);n n coutsumendl;coutsumendl; outsum outsumendlendl; ; n n n n 字符常量与字符串常量的区别n n字符常量表示单个字符,其类型为字符类型(字符常量表示单个字符,其类型为字符类型(charchar););而字符串常量可以表示多个字符,其类型为而字符串常量可以表示多个
32、字符,其类型为一维的常一维的常量字符数组量字符数组(构造数据类型)。(构造数据类型)。n n字符常量用单引号表示;而字符串常量用双引号表示。字符常量用单引号表示;而字符串常量用双引号表示。n n对字符常量的操作按对字符常量的操作按charchar类型进行;对字符串常量的类型进行;对字符串常量的操作按字符数组的规定。操作按字符数组的规定。n n字符常量在内存中占一个字节;字符串常量占多个字字符常量在内存中占一个字节;字符串常量占多个字节,其字节数为:字符串中的字符个数加上节,其字节数为:字符串中的字符个数加上1 1。AAAA0符号常量n n程序中的常量除了采用字面常量形式外,还可以首程序中的常量
33、除了采用字面常量形式外,还可以首先通过常量定义给常量取一个名字并指定一个类型;先通过常量定义给常量取一个名字并指定一个类型;然后,在程序中通过常量名来使用这些常量。然后,在程序中通过常量名来使用这些常量。n n符号常量的定义格式为:符号常量的定义格式为:1 1)const double PI=3.1415926; const double PI=3.1415926; 2 2)#define PI 3.1415926#define PI 3.1415926比较:比较:(1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,(2) 有些集
34、成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。n n符号常量的使用:符号常量的使用:2*PI*r2*PI*r使用符号常量的好处n n增加程序的易读性增加程序的易读性 n n提高程序对常量使用的一致性提高程序对常量使用的一致性 n n增强程序的易维护性增强程序的易维护性 注意n n宏是简单的符号替换,建议多使用宏是简单的符号替换,建议多使用constconst定义符定义符号常量号常量n n宏的缺陷及避免宏的缺陷及避免 #define #define ADD(a,bADD(a,b) ) a+ba+b (1 1) ADD(a,bADD(a,b)*)*ADD(a,bADD(a
35、,b) ) a+ba+b* *a+ba+b (2) ADD(a+1 (2) ADD(a+1,b)*ADD(a,b+1)b)*ADD(a,b+1) a+1+b*a+b+1 a+1+b*a+b+1避免方法:避免方法: #define #define ADD(a,bADD(a,b) ) ( (a)+(ba)+(b) ) 变量n n程序中可变的数据用变量来表示。例如:在计算圆周长的表达式2*PI*r中,半径r就是一个可变的数据,它可能是通过用户输入得到,也可能由程序的其它部分计算得到。 变量的基本特性n n名字:用标识符表示。n n类型:指定变量能取何种值、对其能进行何种运算(操作)以及所需内存空间的
36、大小等。 n n值:在类型的值集范围内可变。n n内存空间和地址:存储变量当前值的内存空间以及该空间的地址。变量的定义n nC+C+语言规定:程序中使用到的每个变量都要有定语言规定:程序中使用到的每个变量都要有定义(有的语言不需要)。格式为:义(有的语言不需要)。格式为: ;或者或者 =;例如:例如:intint a=0; a=0;intint b=a+1; b=a+1;double x; double x; 或:或:intint a=0,b=a+1; a=0,b=a+1;double x;double x;变量的声明n n在在C+C+程序中访问(使用)一个变量之前,必须程序中访问(使用)一个
37、变量之前,必须对它进行声明。对它进行声明。n n变量定义属于一种声明,称为变量定义属于一种声明,称为定义性声明定义性声明。n n变量声明的另一种形式为:变量声明的另一种形式为:extern extern ; 称为称为非定义性声明非定义性声明。 在使用一个在使用一个全局变量全局变量前,如果未见到它的定义性声明,前,如果未见到它的定义性声明,则需要对它进行非定义性声明。则需要对它进行非定义性声明。n n为了描述方便,今后为了描述方便,今后 把定义性声明称为定义,把定义性声明称为定义, 把非定义性声明称为声明。把非定义性声明称为声明。/file2.cppvoid g() /定义 extern int
38、 x,y; /声明 int z; /定义 z = x + y;/file1.cppint x=0; /定义void f() /定义 extern int y; /声明 x = y + 1;int y=0; /定义int main() /定义 extern void g(); /声明 y = x + 2; f(); g(); return 0;变量定义与声明的区别n n变量定义点要给变量分配空间,变量声明则否。变量定义点要给变量分配空间,变量声明则否。n n变量定义点可以给变量赋初值(对变量进行初始变量定义点可以给变量赋初值(对变量进行初始化),变量声明则否。如化),变量声明则否。如: inti
39、nt a=1,b=2,c=3; /OK a=1,b=2,c=3; /OK extern extern intint d=4; /Error d=4; /Errorn n在整个程序中,一个变量的定义只能有一个,而在整个程序中,一个变量的定义只能有一个,而对该变量的声明可以有多个。对该变量的声明可以有多个。n n变量声明的作用是什么变量声明的作用是什么? 防止编译出错,统一定义(防止编译出错,统一定义(来客煮饭来客煮饭)变量值的输入#include #include / /插入一些在标准库中定义的输入插入一些在标准库中定义的输入/ /输出操作所需要的声明输出操作所需要的声明using namesp
40、ace std; /using namespace std; /C+C+标准库中的程序实体是在名空间标准库中的程序实体是在名空间stdstd中定义的。中定义的。intint i; i;double d;double d;.cincin i; / i; /从键盘输入一个整数类型数给变量从键盘输入一个整数类型数给变量i icincin d; / d; /从键盘输入一个双精度浮点数给变量从键盘输入一个双精度浮点数给变量d d 上述的键盘输入也可以写在一条语句中:上述的键盘输入也可以写在一条语句中: cincin i d; i d;在输入时,一般用在输入时,一般用空白符空白符(空格符、横向制表符或回车
41、符)(空格符、横向制表符或回车符)作为输入数据之间的分隔符,每一个输入数据的格式应与相应变量作为输入数据之间的分隔符,每一个输入数据的格式应与相应变量的类型相符。例如的类型相符。例如 输入数据为:输入数据为:1212凵凵3.43.4 则则i i的值为:的值为:1212,d d的值为:的值为:3.43.4。 输入的数据为:输入的数据为: 012012凵凵3.43.4 则则i i的值为:的值为:1010,d d的值为:的值为:3.43.4。 输入的数据为:输入的数据为:12a3.412a3.4 则则i i的值为:的值为:1212,d d的值没有意义。的值没有意义。 操作符(运算符)n n操作符用于
42、描述对数据的运算。这里的数据称为操操作符用于描述对数据的运算。这里的数据称为操作数,它们可以是:作数,它们可以是: 常量常量 变量变量 函数调用的结果函数调用的结果 其它操作符的运算结果其它操作符的运算结果n n例如,在下面的计算式子中,例如,在下面的计算式子中,a a+b b- -4 4( (- -a)a)* *( (b b+c c) )a a/f/f(10)(10)x=a x=a +、- -(减法)、(减法)、- -(取负)、(取负)、* *、/ /、f f(函数调用)以及(函数调用)以及=(赋值)都是操作符,(赋值)都是操作符, 而而a a、b b、4 4、c c、1010以及以及x x
43、都是操作数:操作符:都是操作数:操作符:操作符的副作用n n通常情况下,操作符所指定的运算不会改变操作通常情况下,操作符所指定的运算不会改变操作数的值(运算结果将保存在临时的存储单元中)。数的值(运算结果将保存在临时的存储单元中)。例如:例如: x+yx+y不会改变不会改变x x和和y y的值,计算结果保存在一个临时的的值,计算结果保存在一个临时的内存单元或寄存器中。内存单元或寄存器中。n n在在C+C+语言中,有些操作符(如:赋值语言中,有些操作符(如:赋值=、自增、自增+、自减、自减-等操作符)的运算在得到一个运算结等操作符)的运算在得到一个运算结果的同时,也会改变操作数的值,称这些操作符
44、果的同时,也会改变操作数的值,称这些操作符带有带有副作用副作用。例如:。例如: x+x+除了得到一个计算结果外,还会改变除了得到一个计算结果外,还会改变x x的值的值n n有副作用的操作有时会产生不良结果!有副作用的操作有时会产生不良结果! 例:例: intint x=1; x=1; intint y= y=x+xx+x+; +; y=?y=?C+操作符的种类n n 算术操作符n n 关系与逻辑操作符 n n 位操作符 n n 赋值操作符n n 其它操作符 算术操作符n n算术操作符用于实现通常意义下的数值运算。操作数类型一般为算术类型,有时也可以是枚举类型和指针类型。包括: 取负取负“ “-
45、”-”与取正与取正“ “+” +” ,例如:,例如:-x-x 加加“ “+”+”、减、减“ “-”-”、乘、乘“*”“*”、除、除“ “/”/”和取余数和取余数“ “%” %” n n操作符操作符“ “/”/”用于整型操作数时表示整除,小数点后面用于整型操作数时表示整除,小数点后面的数将舍去,并且一般不进行四舍五入。例如:的数将舍去,并且一般不进行四舍五入。例如:3/23/2的结果为的结果为1 1;-10/3-10/3的结果为的结果为-3 -3 n n取余数取余数“ “%”%”操作符用于操作符用于计算两个整型计算两个整型数相除的余数,数相除的余数,操作数的类型应为整型和枚举类型。例如:操作数的
46、类型应为整型和枚举类型。例如:10%310%3的结果为的结果为1 1;8%28%2的结果为的结果为0 0 n n(a/b)*(a/b)*b+a%bb+a%b = a; 3.15%3 = a; 3.15%3 X X算术操作符(续)自减自减“ “-”-”和自增和自增“ “+” +” intint x=1,y; x=1,y; y = (+x) /y = (+x) /结果为结果为2 2(y y),),x x的值是的值是2 2(先加后用)(先加后用)y = (x+) /y = (x+) /结果为结果为1 1(y y),), x x的值是的值是2 2(先用后加)(先用后加)注意:操作符“-”和“+”是两个
47、带副作用的操作符 关系操作符关系操作符 n n程序中经常要根据某个条件来决定其后续的动作,这里的条件体现为对数据进行比较(关系运算)和逻辑运算。 n n关系操作符用于对数据进行大小比较,有:( (大于大于), ), = ( (不小于不小于), ), = 23 2的结果为的结果为truetrue4.3 1.24.3 1.2的结果为的结果为falsefalseA BA B的结果为的结果为truetruefalse truefalse true的结果为的结果为truetruen n一些实数在计算机内部表示的是其近似值,用关一些实数在计算机内部表示的是其近似值,用关系操作符直接对浮点数进行比较,有时会
48、得出错系操作符直接对浮点数进行比较,有时会得出错误的结果:误的结果:double double x,yx,y; ;.y-xy-x*(*(y/xy/x) = 0.0 /) = 0.0 /? ?n n应避免对两个实数进行应避免对两个实数进行“ “=”=”和和“ “!=”!=”比较运算比较运算 x = yx = y可写成:可写成:fabs(x-yfabs(x-y)1e-6)1e-6)1e-6逻辑操作符逻辑操作符 逻辑操作符实现逻辑运算,用于复杂条件的表示中。逻辑操作符实现逻辑运算,用于复杂条件的表示中。 ! !(逻辑非)、(逻辑非)、&(逻辑与)、(逻辑与)、|(逻辑或)(逻辑或) 操作数为操作数为
49、boolbool类型类型!true - false!true - false!false - true!false - truefalse | false - falsefalse | false - falsefalse | true - truefalse | true - truetrue | false - truetrue | false - truetrue | true - truetrue | true - truefalse & false - falsefalse & false - falsefalse & true - falsefalse & true - false
50、true & false - falsetrue & false - falsetrue & true - truetrue & true - true例如例如: !(a b)(age 30) (ch 9) 短路求值短路求值 (short-circuit evaluation) n n在C+中,对于逻辑“与”操作符“&”和逻辑“或”操作符“|”,如果第一个操作数已能确定运算结果了,则不再计算第二个操作数的值,该规则称为短路求值。例如:true | x true | x 的结果为的结果为 truetruefalse & x false & x 的结果为的结果为 falsefalsen n短路求值
51、一方面能够提高逻辑运算的效率,另一方面它也能为逻辑运算式中的其它运算提供一个“卫士”(guard)。例如:(number != 0) & (1/number 0.5)(number != 0) & (1/number 0.5)number=0 number=0 则不会计算则不会计算1/number 0.51/number 0.5位操作位操作n n在在C+C+中提供了对整型和枚举类型数据按操作数的各中提供了对整型和枚举类型数据按操作数的各个二进制位分别进行运算的操作,包括:逻辑位运算个二进制位分别进行运算的操作,包括:逻辑位运算和移位运算。和移位运算。 n n逻辑位操作逻辑位操作 (按位取反)(
52、按位取反), , & &(按位与)(按位与), , | |(按位或)(按位或), , (按位异或)(按位异或)0 0 1 11 1 0 00|0 0|0 0 00|1 0|1 1 11|0 1|0 1 11|1 1|1 1 100 00 0 001 01 1 110 10 1 111 11 0 00&0 0&0 0 00&1 0&1 0 01&0 1&0 0 01&1 1&1 1 1例:例:s & 0x10 /判s的第5位(从低位数)是0还是1s = (s | 0x40) /把第7位设置为1s = (s & 0xF7) /表示把第4位设置为0 位操作(续)位操作(续)n n移位操作移位操作 ,
53、 (右移)(右移) 左移:把第一个操作数按二进制位依次左移由第二个操作左移:把第一个操作数按二进制位依次左移由第二个操作数所指定的位数。左移时,高位舍弃,低位补数所指定的位数。左移时,高位舍弃,低位补0 0。例如。例如: :0x3F61 20x3F61 2的结果为的结果为0xFD84 0xFD84 右移:把第一个操作数按二进制位依次右移由第二个操作右移:把第一个操作数按二进制位依次右移由第二个操作数所指定的位数。右移时,低位舍弃,高位按下面规则处数所指定的位数。右移时,低位舍弃,高位按下面规则处理:理:n n对于无符号数,高位补对于无符号数,高位补0 0 n n对于有符号数,高位与原来的最高位
54、相同对于有符号数,高位与原来的最高位相同 n n移位操作常常用于实现特殊的乘法和除法运算。例如,移位操作常常用于实现特殊的乘法和除法运算。例如,在某些情况下,在某些情况下, 把一个整型数按二进位左移一位相当于把该整型数乘以把一个整型数按二进位左移一位相当于把该整型数乘以2 2, 把一个整型数按二进位右移一位相当于把该整型数除以把一个整型数按二进位右移一位相当于把该整型数除以2 2, 赋值操作赋值操作n n除了通过输入操作来改变变量的值以外,通常,变量除了通过输入操作来改变变量的值以外,通常,变量值的改变是通过赋值操作来实现。值的改变是通过赋值操作来实现。n n简单赋值操作符简单赋值操作符a =
55、 b a = b n n复合赋值操作符复合赋值操作符 +=+=,-=-=,* *=,/=/=,%=%=,&=&=,|=|=,=,= a *= b a *= b 功能上等价于:功能上等价于:a = a * ba = a * b 有时能提高效率有时能提高效率n n赋值操作构成了冯赋值操作构成了冯 诺依曼计算模型的一个重要特征诺依曼计算模型的一个重要特征(状态转换状态转换),同时,也构成了冯),同时,也构成了冯 诺依曼计算的一诺依曼计算的一个瓶颈。个瓶颈。其它操作符其它操作符n n 条件操作符(条件操作符(?:?:) d1?d2:d3 d1?d2:d3 如果如果d1d1的值为的值为truetrue或
56、非零,则运算结果为或非零,则运算结果为d2d2,否则为,否则为d3d3。例如:例如:c = (ac = (ab)?a:bb)?a:b /c /c中为中为a a和和b b中的最大值中的最大值n n 逗号操作符逗号操作符 d1,d2,d3,. d1,d2,d3,. 从左至右依次进行各个运算,操作结果为最后一个运算的从左至右依次进行各个运算,操作结果为最后一个运算的结果结果 逗号操作表示的计算更加清晰,例如:逗号操作表示的计算更加清晰,例如:x = x = a+ba+b, y = , y = c+dc+d, z = , z = x+yx+yn n sizeofsizeof sizeofsizeof(
57、) ) 或或 sizeofsizeof() ) 计算某类型的数据占用的内存大小(字节数)计算某类型的数据占用的内存大小(字节数)操作数的类型转换n n在在C+C+中,进行运算前有时需要对操作数进行中,进行运算前有时需要对操作数进行类型类型转换转换,特别是对一些双目操作符,当两个操作数类,特别是对一些双目操作符,当两个操作数类型不同时,往往要把它们转换成相同类型,操作结型不同时,往往要把它们转换成相同类型,操作结果的类型一般与转换后的操作数类型相同。果的类型一般与转换后的操作数类型相同。n nC+C+的类型转换方式有两种:的类型转换方式有两种: 隐式转换隐式转换:由编译程序按照某种预定的规则进行
58、自动转:由编译程序按照某种预定的规则进行自动转换。换。 显式转换显式转换:由写程序的人在程序中用类型转换操作符明:由写程序的人在程序中用类型转换操作符明确地指出转换。确地指出转换。n n不管是隐式转换还是显式转换,都不会改变被转换不管是隐式转换还是显式转换,都不会改变被转换的操作数,转换得到的结果将存储在临时的存储单的操作数,转换得到的结果将存储在临时的存储单元中。元中。 隐式转换n n对于算术运算,当操作数类型为算术类型或枚举类型时,编译程序将在进行算术运算前按常规算术转换规则(usual arithmetic conversions)自动进行操作数类型的隐式转换。n n算术运算的结果类型与
59、转换后的操作数类型相同。常规算术转换规则常规算术转换规则类型转换层次:操作数按运算规则自动依次转化为表达式中最宽的类型。 如果其中一个操作数类型为long double,则另一个转换成long double。 否则,如果其中一个操作数类型为double,则另一个转换成double。 否则,如果其中一个操作数类型为float,则另一个转换成float。 否则,先对操作数进行整型提升转换整型提升转换,如果转换后操作数的类型不一样,则按e)以后的规则再进行转换。有符号和无符号类型之间的转换有符号和无符号类型之间的转换:原则是在保证精:原则是在保证精度的前提下转换为能够容纳更多位的数据类型。度的前提下
60、转换为能够容纳更多位的数据类型。即即signedsigned型数值会转换为型数值会转换为unsignedunsigned型。型。e)e)如果其中一个操作数类型为如果其中一个操作数类型为unsigned long unsigned long intint,则,则另一个转换成另一个转换成unsigned long unsigned long intint。f)f)否则,如果一个操作数类型为否则,如果一个操作数类型为long long intint,另一个操作,另一个操作数类型为数类型为unsigned unsigned intint,那么,如果,那么,如果long long intint能表示能表
61、示unsigned unsigned intint的所有值,则的所有值,则unsigned unsigned intint转换成转换成long long intint,否则,两个操作数都转化成,否则,两个操作数都转化成unsigned unsigned long long intint。g)g)否则,如果一个操作数类型为否则,如果一个操作数类型为long long intint,则另一个操,则另一个操作数转换成作数转换成long long intint。h)h)否则,如果一个操作数类型为否则,如果一个操作数类型为unsigned unsigned intint,则另,则另一个操作数转换成一个操
62、作数转换成unsigned unsigned intint。隐式类型转化n n隐式转换具体规则 例:例: intint i=5 i=5; double j=3.5double j=3.5; double z=double z=i+ji+j; ;n n显示转化: 例例1 1: double z=double z=(doubledouble)i+ji+j; 例例2 2: double z=double z=static_caststatic_cast(i) + j(i) + j隐式转换的问题隐式转换的问题n n隐式转换有时不能满足要求。n n例如:intint i=-10; i=-10;unsig
63、ned unsigned intint j=3; j=3; i+ji+j将得到错误的结果:将得到错误的结果:4294967289 4294967289 n n再例如:(溢出)intint i=2147483647; / i=2147483647; /intint类型中最大的正整数类型中最大的正整数intint j=10; j=10;i+ji+j将得到错误的结果:将得到错误的结果:-2147483639-2147483639显式转换(强制类型转换)显式转换(强制类型转换)n n显式转换是指在程序中用类型转换操作符显式地指显式转换是指在程序中用类型转换操作符显式地指出转换,显式转换又称强制类型转换
64、。其格式为:出转换,显式转换又称强制类型转换。其格式为:()或或()n n例如:例如:intint i=-10; i=-10;unsigned unsigned intint j=3; j=3; i+(int)ji+(int)j将得到正确的结果:将得到正确的结果:-7 -7 n n再例如:再例如:intint i=2147483647; / i=2147483647; /intint类型中最大的正整数类型中最大的正整数intint j=10; j=10;( (double)i+jdouble)i+j将得到正确的结果:将得到正确的结果:2147483657.0 2147483657.0 整型提升
65、转换整型提升转换(integral promotions)n n对于char、signed char、unsigned char、short int、unsigned short int类型,如果int型能够表示它们的值,则这些类型转换成int,否则,这些类型转换成unsigned int。n nbool型转换成int型,false为0;true为1。n nwchar_t和枚举类型转换成下列类型中第一个能表示其所有值的类型:int、unsigned int、long int、unsigned long int。n n对于关系操作符,当操作数是算术类型和枚举类对于关系操作符,当操作数是算术类型和
66、枚举类型时,编译程序将按常规算术转换规则对它们进型时,编译程序将按常规算术转换规则对它们进行转换。行转换。n n对于逻辑操作符,当操作数是算术型、枚举类型对于逻辑操作符,当操作数是算术型、枚举类型和指针类型数据进行操作,在操作前需进行和指针类型数据进行操作,在操作前需进行逻辑逻辑类型转换类型转换: 对于算术型和枚举类型,零转成对于算术型和枚举类型,零转成falsefalse,非零转成,非零转成truetrue; 对于指针类型,空指针转成对于指针类型,空指针转成falsefalse,非空指针转成,非空指针转成truetrue。n n对于移位操作,编译程序会对操作数按整型提升对于移位操作,编译程序
67、会对操作数按整型提升规则进行类型转换,运算结果的类型与第一个操规则进行类型转换,运算结果的类型与第一个操作数类型(进行类型转换之后)相同。作数类型(进行类型转换之后)相同。n n对于赋值操作符,当赋值操作的两个操作数类型不同时,将按赋值转换规则进行隐式类型转换,即,把右边操作数转换成左边的操作数类型。n n对于条件操作符:第一个操作数也可以是算术型、枚举类型以及第一个操作数也可以是算术型、枚举类型以及指针类型,编译程序将对其进行逻辑转换:指针类型,编译程序将对其进行逻辑转换:0 0转转成成falsefalse;非;非0 0转成转成truetrue。第二、三个操作数可以是任意类型,当它们的第二、
68、三个操作数可以是任意类型,当它们的类型不同时,编译程序将对它们进行类型转换,类型不同时,编译程序将对它们进行类型转换,其中,对于算术类型和枚举类型,编译程序将其中,对于算术类型和枚举类型,编译程序将按常规算术转换规则进行转换。按常规算术转换规则进行转换。条件操作的结果类型为转换之后的第二、三个条件操作的结果类型为转换之后的第二、三个操作数类型。操作数类型。表达式表达式n n表达式是由操作符、操作数以及圆括号所组成的运算式。其中,操作数可以是常量、变量或函数调用,也可以是用圆括号括起来的表达式。例如: ( (a+ba+b)*c/12-max(a,b) )*c/12-max(a,b) n n 表达
69、式类型算术表达式算术表达式关系关系/ /逻辑表达式逻辑表达式地址表达式等地址表达式等 表达式中的类型转换表达式中的类型转换n n编译程序常常要对表达式中的操作数进行隐式类型编译程序常常要对表达式中的操作数进行隐式类型转换,转换,C+C+的转换过程是的转换过程是逐个操作符逐个操作符进行类型转换。进行类型转换。例如:例如:short short intint a=2 a=2; ; intint b=2147483647; / b=2147483647; /intint类型中最大的正整数类型中最大的正整数double c=2.0;double c=2.0;表达式:表达式:a*a*b/cb/c将得到错
70、误的结果:将得到错误的结果:-1.0-1.0。解决办法:解决办法:( (double)adouble)a* *b/cb/c或或a*(a*(double)b/cdouble)b/c 结果为:结果为:2147483647.0 2147483647.0 操作符习题n n有整型变量有整型变量x x和和y y的值分别为的值分别为2525和和6 6,观察下列运算的,观察下列运算的值。值。(1 1) x/8 x/8 (2 2)x*3%4 x*3%4 (3)(3) -56%6 -56%6 (4) (4) (int)5.6%2 (int)5.6%2 (5) (5) -56/6 -56/6 (6) (6) 9.0
71、/2 9.0/2 (7) (7) -15/4.0 -15/4.0n nintint a=6 a=6,请计算表达式,请计算表达式 a+=a-=a*aa+=a-=a*a和和 a+=a-=a*=aa+=a-=a*=a的值。的值。 n n假定假定x=20x=20,y=3.25y=3.25,chch为一个字符变量,观察下为一个字符变量,观察下列关系表达式的值。列关系表达式的值。 x=0 x=0 x!=y x!=y x+=21 x+=21 +x=21 +x=21 y+10y*10 y+10y*10 x-20 x-20 a=A a=A chch!=0 !=0 n n写出下列程序运行的输出结果。#includ
72、e #include void main()void main() intint a(3),b(4),c; a(3),b(4),c;c=ac=ab?+a:+bb?+a:+b; ;/式式式式 coutcouta,b,ca,b,cendlendl; ; c=a-b?a+b:a-3?b:a; c=a-b?a+b:a-3?b:a; /式式式式coutcouta,b,ca,b,c=21 x+=21 /结果为结果为false(0)false(0),比较后,比较后x x变为变为2121 +x=21 +x=21 /结果为结果为true(1)true(1),比较后,比较后x x变为变为2121 y+10y*10
73、 y+10y*10 /结果为结果为true(1)true(1) x-20 x-bab不成立,条件表达式的值取不成立,条件表达式的值取+b+b的值。的值。 式式:因:因a-ba-b的结果为的结果为-2-2,即非,即非0,0,因此因此c c取取a+ba+b的值。的值。 程序的运行的结果如下:程序的运行的结果如下: 3 3,5 5,5 5 3 3,5 5,8 8写出下列程序运行的输出结果。写出下列程序运行的输出结果。#include #include void main()void main() intint a(3),b(4),c; a(3),b(4),c;c=ac=ab?+a:+bb?+a:+b
74、; ;/式式式式coutcouta,b,ca,b,cendlendl; ; c=a-b?a+b:a-3?b:a; c=a-b?a+b:a-3?b:a; /式式式式coutcouta,b,ca,b,cendlendl; ; 操作符的优先级和结合性操作符的优先级和结合性n n一个表达式中可以包含多个操作符的运算,先执行哪一个操一个表达式中可以包含多个操作符的运算,先执行哪一个操作符所指定的运算?作符所指定的运算?n n对相邻的两个操作符,按下面规则确定:对相邻的两个操作符,按下面规则确定: 圆括号:圆括号内的先运算圆括号:圆括号内的先运算 优先级:优先级高的先运算优先级:优先级高的先运算 结合性:
75、相同优先级按左结合或右结合结合性:相同优先级按左结合或右结合 例如:例如:a+ba+b*(*(c-dc-d) ) 计算次序为:计算次序为:- -,* *,+n n对不相邻的操作符,对不相邻的操作符,C+C+一般没有规定计算次序(一般没有规定计算次序(&、|、?:?:和和, ,操作符除外)操作符除外) 例如:例如:( (a+ba+b)*()*(c-dc-d) C+) C+没有规定没有规定+和和- -的计算次序。的计算次序。n n注意:在实际写程序时不要考验自己的记忆和别人的注意:在实际写程序时不要考验自己的记忆和别人的记忆能力,应用多语句或括号明确的区分优先级。记忆能力,应用多语句或括号明确的区
76、分优先级。优先级和结合性优先级和结合性优先级和结合性优先级和结合性表达式的副作用问题表达式的副作用问题n n当一个表达式中包含带副作用的操作符时,该表达式的结果是不确定的。例如:例如: (x+1)*(+x)(x+1)*(+x)C+C+没有规定操作符没有规定操作符+和和+谁先计算,因此,谁先计算,因此,不同的编译程序可能会给出不同的实现:不同的编译程序可能会给出不同的实现:( (设设x=1x=1)n n 先计算先计算+,则结果为:,则结果为:4 4n n 先计算先计算+,则结果为:,则结果为:6 6n n应尽量避免把带副作用的操作符用在复杂的表达式中,最好把它们作为单独的操作来用。表达式的输出表
77、达式的输出n nC+C+提供了多种把计算结果输出到显示器的途径,提供了多种把计算结果输出到显示器的途径,最典型的途径是利用最典型的途径是利用C+C+标准库中定义的对象标准库中定义的对象coutcout和插入操作符和插入操作符“ “”来实现,例如:来实现,例如:#include #include using namespace std;using namespace std;.coutcout a+ba+b*c*c;coutcout a; a;coutcout b; b;coutcout endlendl; /; /输出一个换行符输出一个换行符或或coutcout a+ba+b*c a b *c
78、 a b endlendl; ;操作符习题2n n观察下列表达式的值和合法性(观察下列表达式的值和合法性(intint x=10 x=10)。)。 (1 1)-x- -x- (2 2)-+x -+x (3 3) y=x+ y=x+ (4 4)y=-x y=-x (5 5) y=x*+x; y=x*+x; n n分析下列程序运行的输出结果。分析下列程序运行的输出结果。#include #include void main()void main() intint a(7),b(8); a(7),b(8); /a(7)/a(7)表示定义变量表示定义变量表示定义变量表示定义变量a a时并赋值时并赋值时
79、并赋值时并赋值7. 7.a=a=a|ba|b2&b;2&b;coutcoutb=bta=ab=bta=a1;a=19, b=7; a=(a&035)|(b&0xf3)1;coutcoutb=bta=ab=bta=aendlendl; ; 解答1n n观察下列表达式的值和合法性(观察下列表达式的值和合法性(intint x=10 x=10)。)。 (1 1) -x- /*-x- /*因因-的结合性为从右向左,先执的结合性为从右向左,先执行行x-x-, x-x-的值为的值为1010,它不是一个变量,当接着进,它不是一个变量,当接着进行左侧减行左侧减1 1时非法时非法* */ / (2 2)-+x
80、-+x / /结果结果x x的值为的值为1010 (3 3)y=x+ /xy=x+ /x变为变为1111,y y的值为的值为1010 (4 4)y=-xy=-x /x /x变为变为9 9,y y的值为的值为9 9 (5 5) y=x*+x; /*y=x*+x; /*因自增操作因自增操作+优先级高于优先级高于乘运算乘运算* *,因此先执行,因此先执行+x+x,x x的值为的值为1111,再计算乘,再计算乘法并赋值,得法并赋值,得y y的值为的值为121121。* */ /*/*注意注意:当算术表达式中多处出现有同一变量时,最:当算术表达式中多处出现有同一变量时,最好不要对它进行好不要对它进行+或
81、或-操作,以免发生混乱。应操作,以免发生混乱。应将此语句改写为将此语句改写为“ “+x;”yx;”y=x*x;”=x*x;”这两条语句。这两条语句。* */ /解答2n n分析下列程序运行的输出结果。分析下列程序运行的输出结果。#include #include void main()void main() intint a(7),b(8); a(7),b(8);a=a=a|a|b b22&bb; ;coutcoutb=bta=ab=bta=a1(b&0xf3)1; ;coutcoutb=bta=ab=bta=a、& &、| |、& & 。作业n n思考教材后面的习题。n n掌握习题7、8、9、10所涉及的内容n n认真思考11题,找到最好的解决方法该部分作业不需上交