1 / 57

第 2 章 数据类型与表达式

第 2 章 数据类型与表达式. 2.1 C++ 的数据类型 2.2 常量 2.3 变量 2.4 C++ 的运算符 2.5 算术运算符与算术表达式 2.6 赋值运算符与赋值表达式 2.7 逗号运算符与逗号表达式. 2.1 C++ 的数据类型. 数据——程序处理的对象 数据类型——根据数据的表达形式的不同而划分的类别。 各种数据在内存中均以0、1的二进制形式存储,但存储格式不同。.

orenda
Download Presentation

第 2 章 数据类型与表达式

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章 数据类型与表达式 2.1 C++的数据类型 2.2 常量 2.3 变量 2.4 C++的运算符 2.5 算术运算符与算术表达式 2.6 赋值运算符与赋值表达式 2.7 逗号运算符与逗号表达式

  2. 2.1 C++的数据类型 数据——程序处理的对象 数据类型——根据数据的表达形式的不同而划分的类别。 各种数据在内存中均以0、1的二进制形式存储,但存储格式不同。

  3. 整型(short int、int、long int)和字符型char的前面,可加修饰符signed(表示“有符号”)或unsigned(表示“无符号”),默认为signed 。 整型数据分为:短整型(short int 或short) 一般整型(int) 长整型(long int或long) sizeof(数据类型):可确定数据类型的字节长度。 例:cout<<sizeof(int)<<endl;

  4. 布尔型(bool):C语言无此类型,它用0代表“假”,非0(如1)代表“真”。C++中添加了该类型,其值为True和False。但不是所有编译器都支持。布尔型(bool):C语言无此类型,它用0代表“假”,非0(如1)代表“真”。C++中添加了该类型,其值为True和False。但不是所有编译器都支持。 • 空类型(void):无值,不能用来定义变量。 浮点型(又称实型)数据分为: 单精度(float) 双精度(double) 长双精度(long double) 一般用double定义存放小数的变量。

  5. 2.2 常量2.2.1 什么是常量 整型常量 实型常量(浮点型常量) 字符常量 字符串常量 • 根据数据类型的不同, 常量可分为: 常量的值是不能改变的,程序中一般包含直接常量(一般常量)和符号常量两种。

  6. 1、整型常量(整数) 分十进制整数、八进制整数和十六进制整数。 书写格式: 注意:10L、10l 表示长整型,10为一般整型。

  7. 在程序中不论把浮点数写成小数形式还是指数形式,在内存中都是以规范化的指数形式存放。在程序中不论把浮点数写成小数形式还是指数形式,在内存中都是以规范化的指数形式存放。 2. 浮点型常量(实型常量) 有两种不同的方式表示:

  8. × 注: (1) 指数形式的书写 数符 数字部分 指数部分 E和e的前面必须要有数字,且E后面的指数必须为整数。 例:e3 、2.1e3.5 、.e3 、e (2)浮点型常数缺省为double型,如表示float型,则在实数后加f或F。 如:34.56f 34.5

  9. 3 字符常量 (1)、普通的字符常量 用单撇号括起来的一个字符,如′a′,′#′。在内存中占一个字节。 注意: ①只能包括一个字符,如′AB′ 是不合法的。 ②字符常量区分大小写字母,如′A′和′a′是两个不同的字符常量。 ③撇号(′)是定界符,而不属于字符常量的一部分。

  10. \ddd:1至3位8进制数。‘\101’表示‘A’,’\007’表示‘\a’响铃\ddd:1至3位8进制数。‘\101’表示‘A’,’\007’表示‘\a’响铃 • \xhh:1至2位16进制数。‘\x41’表示‘A’, ’\x07’表示‘\a’响铃 (2)、转义字符常量 非图形字符(如回车、制表符)及\、'、“等字符。 用以 “\”开头的转义字符常量表示这些特殊字符,见P24表2.2。 '\n' 代表一个“换行”符。 “cout<< '\n' ; ” 与“cout<<endl; ” 作用相同。 ‘\0’为空白符,即NULL,码值为0。 (与‘0’的区别,‘0’的码值为48)

  11. 例如:c1=‘a’ c2=‘b’ (3)、 字符数据在内存中的存储形式及其使用方法 存储该字符相应的ASCII码,并以二进制形式存放。 注意:字符数据的运算,均以字符的ASCII码进行运算。

  12. 字符数据的使用方法: 1、字符数据和整型数据可以相互赋值。 2、字符数据和整型数据之间可以运算。 例2.1字符数据和整型数据相互赋值。 #include <iostream> using namespace std; int main( ) { int i; char j; //j是字符型变量 i='A'; //将一个字符常量赋给整型变量i j=97; //将一个字符常量赋给整型变量j cout<<i<< '\n'<<j<<'\n'; return 0; }

  13. 思考: 如何将一个数字字符转换成数值:‘1’转换为1? 例2.2 字符数据与整数进行算术运算。下面程序的作用是将小写字母转换为大写字母。 #include <iostream> using namespace std; int main( ) {char c1,c2; c1=′a′; c2=′b′; c1=c1-32; c2=c2- ’a’ +’A’; cout<<c1<<′ ′<<c2<<endl; return 0; } ‘0’-‘0’=0 ‘1’-‘0’=1 ‘4’-‘0’=4

  14. C++规定以字符‘\0’作为字符串结束标志。在内存中以‘\0’为结尾。C++规定以字符‘\0’作为字符串结束标志。在内存中以‘\0’为结尾。 • 字符串常量″abc″在内存中占4个字节(而不是3个字节),见图。 4. 字符串常量 用双撇号括起来的部分就是字符串常量。如″abc″。 注意:‘0’ 和 “0” 的区别。‘0’为字符常量,“0”为字符串常量。 • ‘\0’在输出时不显示,只表示字符串结束。 • cout<< ″abc″<< ″s″ <<endl; • 输出4个字符abcs,而不包括'\0'。

  15.  思考: 字符串常量″abc\n″包含几个字符? 注意: ″a″和′a′不同,″a″是字符串常量,′a′ 是字符常量。前者占两个字节,后者占1个字节。 char c; //定义一个字符变量 c=′a′; c=″a″; 编译系统遇到“\”时就会把它认作转义字符的标志,把它和其后的字符一起作为一个转义字符。

  16. 2.2.4 符号常量 例:已知圆半径r , 计算圆的周长及面积。 在C++程序设计中,常用一个符号名代表一个常量,称为符号常量。 预编译命令: #define 符号常量名 值

  17. 2.3 变量2.3.1 什么是变量 变量名 变量 变量值 在程序运行期间值可以改变的量称为变量。 变量类型

  18. 2.3.2 变量名命名规则 • 不能与C++关键字相同(如:不能取名为main、Class、if、friend等) C++规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。如: sum, total2, _day, Student_name 下面标识符是否合法: M.D.John , #33, 3G64 , Ling li , C++,return _student, s_max, Float, float          

  19. 注意:大写字母和小写字母被认为是两个不同的字符。 注意:大写字母和小写字母被认为是两个不同的字符。 如:sum和SUM是两个不同的变量名。 命名约定: 1、变量名、函数名用小写字母; 2、符号常量名及宏用大写字母; 3、下划线开头的名字常为系统程序(库函数用),用户一般不用。 4、要有意义:如sum表示“求和变量”。 国外软件命名时,第1个字母表示数据类型,如isum

  20. 2.3.3 定义变量 • C语言要求变量的定义应该放在所有的执行语句之前,而C++则只要求在第一次使用该变量之前进行定义即可。 变量必须“先定义,后使用” 。 如:float a , b , c; 定义a,b,c为单精度型变量,注意各变量间以逗号分隔,最后是分号。

  21. inta; //定义a为一般整型变量 longb; //定义b为长整型变量 shortc; //定义c变量 unsignedshortd; //定义d为无符号短整型变量 floate; //定义e为单精度浮点型变量 doublef; //定义f为双精度浮点型变量 longdoubleg; //定义g为长双精度浮点型变量 charh; //定义h为字符型变量  注意:string i 标准数据类型中无字符串类型的变量

  22. 2.3.4 变量赋初值 注意:数学函数调用必须包含头文件“cmath”(或math.h) : #include <cmath> 或 #include <math.h> 变量定义时赋初值。初值可以是常量,也可以是一个表达式。如 float a , b = 5.78, c= 2*sin(2.0); • 如果对变量未赋初值,则该变量的初值是一个不可预测的值。(变量未赋值就使用非常危险。) cout<<a<<endl;

  23. 在变量定义时,对多个变量赋予同一初值,必须分别指定,不能写成: float a = b = c = 4.5; 而应写成 : float a = 4.5 , b = 4.5 , c = 4.5; 或 float a , b ; float c=a=b=4.5;

  24. 2.3.5 常变量 注意: 1、在定义常变量时必须同时对它初始化。 2、常变量不能出现在赋值号的左边。 const int pi; pi = 3.1415; 例如:const int pi = 3.1415; const表示定义常变量,变量的值在程序运行期间不能改变。 

  25. #define命令定义的符号常量与const定义的常变量的区别:#define命令定义的符号常量与const定义的常变量的区别: 1、 #define定义的符号常量只是用一个符号代替一个常量值,在预编译时把所有符号常量替换为所指定的字符串,在内存中并不存在以符号常量命名的存储单元。 2、 const定义的常变量具有变量的特征,有类型,在内存中存在着以它命名的存储单元。与一般变量惟一的不同是指定变量的值不能改变(只读)。 (通常可用来定义函数参数)

  26. 2.4 C++的运算符 C++的运算符十分丰富,使得C++的运算十分灵活方便。C++提供了以下运算符: (1) 算术运算符 +(加)-(减) *(乘) /(除) %(整除求余)++(自加) --(自减) (2) 关系运算符 >(大于)<(小于) ==(等于)>=(大于或等于)<=(小于或等于)!=(不等于)

  27. (3) 逻辑运算符 &&(逻辑与) ||(逻辑或) !(逻辑非) (4) 位运算符 <<(按位左移) >>(按位右移) &(按位与) |(按位或) ∧(按位异或) ~(按位取反) (5) 赋值运算符 (=及其扩展赋值运算符) (6) 条件运算符 (?:) (7) 逗号运算符 (,) (8) 指针运算符 (*) (9) 引用运算符和地址运算符 (&) (10) 求字节数运算符(sizeof) (11) 强制类型转换运算符( (类型) 或类型( ))

  28. 由以上运算符与常量、变量或函数一起构成的每个表达式,在求值后都有一个确定的值。由以上运算符与常量、变量或函数一起构成的每个表达式,在求值后都有一个确定的值。 (12) 成员运算符 (.) (13) 指向成员的运算符 (->) (14) 下标运算符 ([ ]) (15) 其他 (如函数调用运算符())

  29. 2.5 算术运算符与算术表达式 2.5.1 基本的算术运算符 优先级高到低 ++、- -、+(正号)、 -(负号) *(乘)、/(除)、%(取余) +(加法)、 -(减法)

  30. 值为: 2 9/2 值为: 4 • 若 / 的两操作数都为整数,则为整除。 值为:2.5 例:5/2.0 5.0/2 5.0/2.0 (1)/(除) 例:5/2 • 若 / 的两操作数中有一个浮点数,则为正常的整法运算。

  31. 结果为:f = 1 • 如果希望 f 的结果为1.5 ,则可将第三条语句改为: f = (float) i /10 ;或 f = i /10.0; 例: int i = 15; float f; f = i / 10; 例:在C++中, (7/3+1)+5/6 的值是( ) 3

  32. (2) % (取余) • 余数的符号与被除数相同。 n = 40 % 5 n = 40 % 7 n = - 40 % 7 n = - 40 % - 7 0 要求 % 的两操作数必须为整数,不允许对浮点数操作。 例:3 % 4=3 4 % 4=0 - 4 % 3= - 1 4 % -3=1 5 -5 -5

  33. 2.5.2 算术表达式和运算符的优先级与结合性   • 在求解表达式时,先按一个运算对象两侧的运算符的优先级别高低次序执行。 • a-b*c 运算对象包括常量(数值常量、字符常量,不能对字符串常量进行运算) 、变量、函数等。 a*b/c-1.5+’a’a*b/c-1.5+’ab’ • 如果在一个运算对象两侧的运算符的优先级别相同, 则按“自左至右”结合,如 a-b+c 书后附录B:运算符与结合性

  34. 2.5.3 表达式中各类数值型数据间的混合运算 • 在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换的规则按图所示。 在表达式中常遇到不同类型数据之间进行运算,如: 10 + ’a’+1.5 - 1.4 * ’A’

  35. 10+‘a’+ i * f–i / e     1  假设已指定i为整型变量,f为float变量,e为long型,有下面表达式: 10+‘a’+ i * f – i / e (上述的类型转换是由系统自动完成的) 例: 1.5+ 32/5 的值是( ) 7.5 例: (1.5+ 32)/ 5的值是( ) 6.7

  36. 2.5.4 自增和自减运算符( ++ 、-- ) 结果为:j=2 , a=3 (2)、++ a :先a=a+1 , 然后取a的值作为表达式的值。 例:int a; a = 2 ; j = ++a 结果为:j=3 , a=3 (3)、 a-- :先取a的值作为表达式的值,然后a=a-1 例: int a; a = 2 ; j = a-- (1)、a++ :先取a的值作为表达式的值,然后a=a+1 例:int a; a = 2 ; j = a++ 结果为:j=2 , a=1 (4)、 --a :先a=a+1 , 然后取a的值作为表达式的值。 例: int a; a = 2 ; j = --a 结果为:j=3 , a=3

  37. 例:写出下列程序运行结果: int a = 3; int b = ++a; cout<<a<< " "<<b<<endl; int c = a++; cout<<a<< " "<<c<<endl; 答案:4 4 5 4

  38. 答案:10 12 20 注意: 后置++、--的优先级高于前置++、-- #include<iostream> using namespace std; int main() { int i , j , m , n; i=8; j=10; m=++i+j++; n=i+++j; cout<<i<<'\t'<<j<<'\t'<<n<<endl; return 0; }

  39.   (2)自增(减)运算符使用十分灵活,但在很多情况下可能出现歧义性,产生“意想不到”的副作用。 正确地使用++和--,可以使程序简洁、清晰、高效。 请注意: (1)自增(减)运算符只能用于变量,而不能用于常量或表达式。(5++ 、(a+5)++、a++) (3) 自增(减)运算符在C++程序中是经常见到的,常用于循环语句中,使循环变量自动加1。也用于指针变量,使指针指向下一个地址。

  40. 2.5.5 强制类型转换运算符 • 利用强制类型转换运算符将一个表达式转换成所需类型。例如: • (double)a (将a的值转换成double类型) • (int)(x+y) (将x+y的值转换成整型) • (float)(5/2) (2.0) • (float)5/2 (2.5) 在表达式中不同类型的数据会自动地转换类型,以进行运算。 强制类型转换的一般形式为: (类型名)(表达式)

  41. C++还增加了以下形式: 类型名(表达式) 注意:这种写法表达式的括号不能省略。 类似于函数调用的写法。 如int(x) 、int(x+y)、float(5)/2

  42. 输出结果: x=3.6,i=3 a=16,f=19 例2.4 强制类型转换。 #include <iostream> using namespace std; int main( ) { float x=3.6 , f; int a=16 , b=5 , i; i = (int)x; f=(float)a+a/b; cout<<″x=″<<x<<″,i=″<< i<<endl; cout<<″a=″<<a<<″,f=″<< f<<endl; return 0; }

  43. 9.4 2、若变量a已说明为float类型,i为int类型,则下列哪几个表达式能实现将a的数值保留小数点后两位,第三位进行四舍五入的运算。( ) A) a=(a*100+0.5)/100.0; B) i=a*100+0.5;a=i/100.0; C) a=(int)(a*100+0.5)/100.0; D) a=(a/100+0.5)*100.0; B、C 1、如定义int e=8;double f=6.4,g=8.9;则表达式 f+int(e/3*int(f+g)/2)%4的值为( )

  44. 2.6 赋值运算符与赋值表达式2.6.1 赋值运算符( = ) • 双目运算,从右到左。如d=a=b • 赋值操作是一个表达式,每个表达式在求值后都有一个确定的值,其值为赋值号左边表达式的值: 例:cout<<(x=5)<<endl; 作用是将右边的数据赋给左边的一个变量。 如“a=3”,把常量3赋给变量a。

  45. 2.6.2 赋值过程中的类型转换 3 3 65 当赋值运算符两边类型不一致时,根据左边的类型进行自动转换(数值型或字符型) 。 (1) int i; float f=3.6; i=f; cout<<i<<endl; (2) int i=3; float f=3.6; f=i; cout<<f<<endl; (3) char i=‘A’; float f=3.6; f=i; cout<<f<<endl; 注意:short a=10; float b=70000.5; a=b; 将b的值70000.5赋给a,但70000.5超过short的取值范围,超过的部分将会扔掉。运行结果将会出错,但编译不会提示出错。

  46. (4) 将一个int、short或long型数据赋给一个char型变量,只将其低8位原封不动地送到char型变量(发生截断)。例如 short int i=289; char c; c=i; //将一个shortint型数据赋给一个char型变量

  47. 2 设有语句int a=258,b;unsigned char c;b=c=a;则b的值是( )

  48. 运行结果为: 65535 (6) 将signed(有符号)型数据赋给长度相同的unsigned(无符号)型变量,将存储单元内容原样照搬(连原有的符号位也作为数值一起传送)。 例2.5 将有符号数据传送给无符号变量。 #include <iostream> using namespace std; int main( ) { unsigned short a; short int b=-1; a=b; cout<<″a=″<<a<<endl; return 0; }

  49. 2.6.3 复合的赋值运算符 凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符。C++可以使用以下十种复合赋值运算符: +=,-=,*=,/=,%= <<=,>>=,&=,∧=,|= 其中后5种是有关位运算的。 例如,可以有 a+=3 等价于 a=a+3 x*=y+8 等价于 x=x*(y+8) x%=3 等价于 x=x%3

  50. ① a+= b (其中a为变量,b为表达式) ② a+= (b ) (将有下划线的“a+”移到“=”右侧) ③ a = a + ( b ) (在“=”左侧补上变量名a) 注意,若b只有一个值,则括号可以省略;如果b是包含若干项的表达式,则必须有括号。如 ① x %= y+3 ② x %= (y+3) ③ x = x%(y+3)(不要错认为x=x%y+3)

More Related