570 likes | 831 Views
第 2 章 数据类型与表达式. 2.1 C++ 的数据类型 2.2 常量 2.3 变量 2.4 C++ 的运算符 2.5 算术运算符与算术表达式 2.6 赋值运算符与赋值表达式 2.7 逗号运算符与逗号表达式. 2.1 C++ 的数据类型. 数据——程序处理的对象 数据类型——根据数据的表达形式的不同而划分的类别。 各种数据在内存中均以0、1的二进制形式存储,但存储格式不同。.
E N D
第2章 数据类型与表达式 2.1 C++的数据类型 2.2 常量 2.3 变量 2.4 C++的运算符 2.5 算术运算符与算术表达式 2.6 赋值运算符与赋值表达式 2.7 逗号运算符与逗号表达式
2.1 C++的数据类型 数据——程序处理的对象 数据类型——根据数据的表达形式的不同而划分的类别。 各种数据在内存中均以0、1的二进制形式存储,但存储格式不同。
整型(short int、int、long int)和字符型char的前面,可加修饰符signed(表示“有符号”)或unsigned(表示“无符号”),默认为signed 。 整型数据分为:短整型(short int 或short) 一般整型(int) 长整型(long int或long) sizeof(数据类型):可确定数据类型的字节长度。 例:cout<<sizeof(int)<<endl;
布尔型(bool):C语言无此类型,它用0代表“假”,非0(如1)代表“真”。C++中添加了该类型,其值为True和False。但不是所有编译器都支持。布尔型(bool):C语言无此类型,它用0代表“假”,非0(如1)代表“真”。C++中添加了该类型,其值为True和False。但不是所有编译器都支持。 • 空类型(void):无值,不能用来定义变量。 浮点型(又称实型)数据分为: 单精度(float) 双精度(double) 长双精度(long double) 一般用double定义存放小数的变量。
2.2 常量2.2.1 什么是常量 整型常量 实型常量(浮点型常量) 字符常量 字符串常量 • 根据数据类型的不同, 常量可分为: 常量的值是不能改变的,程序中一般包含直接常量(一般常量)和符号常量两种。
1、整型常量(整数) 分十进制整数、八进制整数和十六进制整数。 书写格式: 注意:10L、10l 表示长整型,10为一般整型。
在程序中不论把浮点数写成小数形式还是指数形式,在内存中都是以规范化的指数形式存放。在程序中不论把浮点数写成小数形式还是指数形式,在内存中都是以规范化的指数形式存放。 2. 浮点型常量(实型常量) 有两种不同的方式表示:
× 注: (1) 指数形式的书写 数符 数字部分 指数部分 E和e的前面必须要有数字,且E后面的指数必须为整数。 例:e3 、2.1e3.5 、.e3 、e (2)浮点型常数缺省为double型,如表示float型,则在实数后加f或F。 如:34.56f 34.5
3 字符常量 (1)、普通的字符常量 用单撇号括起来的一个字符,如′a′,′#′。在内存中占一个字节。 注意: ①只能包括一个字符,如′AB′ 是不合法的。 ②字符常量区分大小写字母,如′A′和′a′是两个不同的字符常量。 ③撇号(′)是定界符,而不属于字符常量的一部分。
\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)
例如:c1=‘a’ c2=‘b’ (3)、 字符数据在内存中的存储形式及其使用方法 存储该字符相应的ASCII码,并以二进制形式存放。 注意:字符数据的运算,均以字符的ASCII码进行运算。
字符数据的使用方法: 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; }
思考: 如何将一个数字字符转换成数值:‘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
C++规定以字符‘\0’作为字符串结束标志。在内存中以‘\0’为结尾。C++规定以字符‘\0’作为字符串结束标志。在内存中以‘\0’为结尾。 • 字符串常量″abc″在内存中占4个字节(而不是3个字节),见图。 4. 字符串常量 用双撇号括起来的部分就是字符串常量。如″abc″。 注意:‘0’ 和 “0” 的区别。‘0’为字符常量,“0”为字符串常量。 • ‘\0’在输出时不显示,只表示字符串结束。 • cout<< ″abc″<< ″s″ <<endl; • 输出4个字符abcs,而不包括'\0'。
思考: 字符串常量″abc\n″包含几个字符? 注意: ″a″和′a′不同,″a″是字符串常量,′a′ 是字符常量。前者占两个字节,后者占1个字节。 char c; //定义一个字符变量 c=′a′; c=″a″; 编译系统遇到“\”时就会把它认作转义字符的标志,把它和其后的字符一起作为一个转义字符。
2.2.4 符号常量 例:已知圆半径r , 计算圆的周长及面积。 在C++程序设计中,常用一个符号名代表一个常量,称为符号常量。 预编译命令: #define 符号常量名 值
2.3 变量2.3.1 什么是变量 变量名 变量 变量值 在程序运行期间值可以改变的量称为变量。 变量类型
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
注意:大写字母和小写字母被认为是两个不同的字符。 注意:大写字母和小写字母被认为是两个不同的字符。 如:sum和SUM是两个不同的变量名。 命名约定: 1、变量名、函数名用小写字母; 2、符号常量名及宏用大写字母; 3、下划线开头的名字常为系统程序(库函数用),用户一般不用。 4、要有意义:如sum表示“求和变量”。 国外软件命名时,第1个字母表示数据类型,如isum
2.3.3 定义变量 • C语言要求变量的定义应该放在所有的执行语句之前,而C++则只要求在第一次使用该变量之前进行定义即可。 变量必须“先定义,后使用” 。 如:float a , b , c; 定义a,b,c为单精度型变量,注意各变量间以逗号分隔,最后是分号。
inta; //定义a为一般整型变量 longb; //定义b为长整型变量 shortc; //定义c变量 unsignedshortd; //定义d为无符号短整型变量 floate; //定义e为单精度浮点型变量 doublef; //定义f为双精度浮点型变量 longdoubleg; //定义g为长双精度浮点型变量 charh; //定义h为字符型变量 注意:string i 标准数据类型中无字符串类型的变量
2.3.4 变量赋初值 注意:数学函数调用必须包含头文件“cmath”(或math.h) : #include <cmath> 或 #include <math.h> 变量定义时赋初值。初值可以是常量,也可以是一个表达式。如 float a , b = 5.78, c= 2*sin(2.0); • 如果对变量未赋初值,则该变量的初值是一个不可预测的值。(变量未赋值就使用非常危险。) cout<<a<<endl;
在变量定义时,对多个变量赋予同一初值,必须分别指定,不能写成: 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;
2.3.5 常变量 注意: 1、在定义常变量时必须同时对它初始化。 2、常变量不能出现在赋值号的左边。 const int pi; pi = 3.1415; 例如:const int pi = 3.1415; const表示定义常变量,变量的值在程序运行期间不能改变。
#define命令定义的符号常量与const定义的常变量的区别:#define命令定义的符号常量与const定义的常变量的区别: 1、 #define定义的符号常量只是用一个符号代替一个常量值,在预编译时把所有符号常量替换为所指定的字符串,在内存中并不存在以符号常量命名的存储单元。 2、 const定义的常变量具有变量的特征,有类型,在内存中存在着以它命名的存储单元。与一般变量惟一的不同是指定变量的值不能改变(只读)。 (通常可用来定义函数参数)
2.4 C++的运算符 C++的运算符十分丰富,使得C++的运算十分灵活方便。C++提供了以下运算符: (1) 算术运算符 +(加)-(减) *(乘) /(除) %(整除求余)++(自加) --(自减) (2) 关系运算符 >(大于)<(小于) ==(等于)>=(大于或等于)<=(小于或等于)!=(不等于)
(3) 逻辑运算符 &&(逻辑与) ||(逻辑或) !(逻辑非) (4) 位运算符 <<(按位左移) >>(按位右移) &(按位与) |(按位或) ∧(按位异或) ~(按位取反) (5) 赋值运算符 (=及其扩展赋值运算符) (6) 条件运算符 (?:) (7) 逗号运算符 (,) (8) 指针运算符 (*) (9) 引用运算符和地址运算符 (&) (10) 求字节数运算符(sizeof) (11) 强制类型转换运算符( (类型) 或类型( ))
由以上运算符与常量、变量或函数一起构成的每个表达式,在求值后都有一个确定的值。由以上运算符与常量、变量或函数一起构成的每个表达式,在求值后都有一个确定的值。 (12) 成员运算符 (.) (13) 指向成员的运算符 (->) (14) 下标运算符 ([ ]) (15) 其他 (如函数调用运算符())
2.5 算术运算符与算术表达式 2.5.1 基本的算术运算符 优先级高到低 ++、- -、+(正号)、 -(负号) *(乘)、/(除)、%(取余) +(加法)、 -(减法)
值为: 2 9/2 值为: 4 • 若 / 的两操作数都为整数,则为整除。 值为:2.5 例:5/2.0 5.0/2 5.0/2.0 (1)/(除) 例:5/2 • 若 / 的两操作数中有一个浮点数,则为正常的整法运算。
结果为: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
(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
2.5.2 算术表达式和运算符的优先级与结合性 • 在求解表达式时,先按一个运算对象两侧的运算符的优先级别高低次序执行。 • a-b*c 运算对象包括常量(数值常量、字符常量,不能对字符串常量进行运算) 、变量、函数等。 a*b/c-1.5+’a’a*b/c-1.5+’ab’ • 如果在一个运算对象两侧的运算符的优先级别相同, 则按“自左至右”结合,如 a-b+c 书后附录B:运算符与结合性
2.5.3 表达式中各类数值型数据间的混合运算 • 在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换的规则按图所示。 在表达式中常遇到不同类型数据之间进行运算,如: 10 + ’a’+1.5 - 1.4 * ’A’
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
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
例:写出下列程序运行结果: int a = 3; int b = ++a; cout<<a<< " "<<b<<endl; int c = a++; cout<<a<< " "<<c<<endl; 答案:4 4 5 4
答案: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; }
(2)自增(减)运算符使用十分灵活,但在很多情况下可能出现歧义性,产生“意想不到”的副作用。 正确地使用++和--,可以使程序简洁、清晰、高效。 请注意: (1)自增(减)运算符只能用于变量,而不能用于常量或表达式。(5++ 、(a+5)++、a++) (3) 自增(减)运算符在C++程序中是经常见到的,常用于循环语句中,使循环变量自动加1。也用于指针变量,使指针指向下一个地址。
2.5.5 强制类型转换运算符 • 利用强制类型转换运算符将一个表达式转换成所需类型。例如: • (double)a (将a的值转换成double类型) • (int)(x+y) (将x+y的值转换成整型) • (float)(5/2) (2.0) • (float)5/2 (2.5) 在表达式中不同类型的数据会自动地转换类型,以进行运算。 强制类型转换的一般形式为: (类型名)(表达式)
C++还增加了以下形式: 类型名(表达式) 注意:这种写法表达式的括号不能省略。 类似于函数调用的写法。 如int(x) 、int(x+y)、float(5)/2
输出结果: 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; }
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的值为( )
2.6 赋值运算符与赋值表达式2.6.1 赋值运算符( = ) • 双目运算,从右到左。如d=a=b • 赋值操作是一个表达式,每个表达式在求值后都有一个确定的值,其值为赋值号左边表达式的值: 例:cout<<(x=5)<<endl; 作用是将右边的数据赋给左边的一个变量。 如“a=3”,把常量3赋给变量a。
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的取值范围,超过的部分将会扔掉。运行结果将会出错,但编译不会提示出错。
(4) 将一个int、short或long型数据赋给一个char型变量,只将其低8位原封不动地送到char型变量(发生截断)。例如 short int i=289; char c; c=i; //将一个shortint型数据赋给一个char型变量
2 设有语句int a=258,b;unsigned char c;b=c=a;则b的值是( )
运行结果为: 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; }
2.6.3 复合的赋值运算符 凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符。C++可以使用以下十种复合赋值运算符: +=,-=,*=,/=,%= <<=,>>=,&=,∧=,|= 其中后5种是有关位运算的。 例如,可以有 a+=3 等价于 a=a+3 x*=y+8 等价于 x=x*(y+8) x%=3 等价于 x=x%3
① 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)