《C第2章基本数据类型与表达式ppt课件》由会员分享,可在线阅读,更多相关《C第2章基本数据类型与表达式ppt课件(46页珍藏版)》请在金锄头文库上搜索。
1、第第2 2章章 基本数据类型与表达式基本数据类型与表达式第第2 2章章 基本数据类型与表达式基本数据类型与表达式2.1 C+2.1 C+数据类型概述数据类型概述2.2 C+2.2 C+的基本数据类型的基本数据类型2.3 2.3 常量与变量常量与变量2.4 2.4 运算符与表达式运算符与表达式2.5 2.5 数值运算符与数值表达式数值运算符与数值表达式2.6 2.6 赋值运算赋值运算2.7 2.7 关系与逻辑运算关系与逻辑运算2.8 2.8 条件运算符与逗号表达式条件运算符与逗号表达式2.9 sizeof2.9 sizeof运算符运算符2.10 2.10 表达式的副作用和表达式语句表达式的副作用
2、和表达式语句2.1 c+数据类型概述数据类型概述1.基本数据类型基本数据类型基本数基本数据类型据类型整型整型 int 字符型字符型实型实型逻辑型逻辑型单字符型单字符型char宽字符型宽字符型 wchar_t单精度型单精度型float双精度型双精度型doublebool2.数据类型修饰符数据类型修饰符signed:有符号:有符号 unsigned:无符号:无符号short:短型:短型 long:长型:长型说明:说明:1) 类型修饰符可以修饰除类型修饰符可以修饰除void、bool类型以外的类型以外的其他类型;其他类型;2) 上述修饰符均可用于整型和字符型;上述修饰符均可用于整型和字符型;3) l
3、ong修饰符还适用于双精度浮点数;修饰符还适用于双精度浮点数;2.2 C+的基本数据类型的基本数据类型说明:说明:(1)表中的表中的int可以省略,既在可以省略,既在int之前有修之前有修饰符出现时,可以省略关键字饰符出现时,可以省略关键字int;(2) 单精度类型单精度类型float、双精度类型、双精度类型double、长、长精度类型精度类型long double统称浮点类型;统称浮点类型;(3) char型和各种型和各种int类型统称整型类型;类型统称整型类型;char型变量在内存中以字符的型变量在内存中以字符的ASCII码值码值的形式存储;的形式存储;(4) 字宽字节取决于操作系统和编译
4、器字宽字节取决于操作系统和编译器的实现,可用的实现,可用sizeof验证;验证;/ ch2_1.cpp 测试计算机中数据类型的字节长度测试计算机中数据类型的字节长度#includevoid main() coutchar类型的长度是类型的长度是sizeof(char)endl; cout“宽宽char类型的长度是类型的长度是sizeof(wchar_t)endl; coutint类型的长度是类型的长度是sizeof(int)endl; coutlong类型的长度是类型的长度是sizeof(long)endl; coutfloat类型的长度是类型的长度是sizeof(float)endl; co
5、utdouble类型的长度是类型的长度是sizeof(double)endl; coutlong double类型的长度是类型的长度是sizeof(long double); coutendl;2.3 常量与变量2.3.1 变量变量变量是指程序在运行时其值可改变的变量是指程序在运行时其值可改变的量。每个变量由一个变量名惟一标量。每个变量由一个变量名惟一标识,同时,每个变量又具有一个特识,同时,每个变量又具有一个特定的数据类型。不同类型的变量在定的数据类型。不同类型的变量在内存中占有存储单元的个数不同。内存中占有存储单元的个数不同。变量定义变量定义1.命名变量名命名变量名每个变量都必须有一个名字
6、每个变量都必须有一个名字变量名,变量命变量名,变量命名遵循标识符命名规则。名遵循标识符命名规则。2.标识符命名规则标识符命名规则(1有效字符:只能由字母、数字和下划线有效字符:只能由字母、数字和下划线组成,且以字母或下划线开头。组成,且以字母或下划线开头。( _Num1 , 8NUM, NUM8)(2有效长度:随系统而异,但至少前个有效长度:随系统而异,但至少前个字符有效。如果超长,则超长部分被舍弃。字符有效。如果超长,则超长部分被舍弃。例如,由于例如,由于student_name和和student_number的前个字符相同,有的系统认为这两个变的前个字符相同,有的系统认为这两个变量,是一回
7、事而不加区别。量,是一回事而不加区别。(3C+的关键字不能用作变量名。的关键字不能用作变量名。注意:注意:C+对英文字母的大小敏感,即同一字对英文字母的大小敏感,即同一字母的大小写,被认为是两个不同的字符。习惯母的大小写,被认为是两个不同的字符。习惯上,变量名和函数名中的英文字母用小写,以上,变量名和函数名中的英文字母用小写,以增加可读性。增加可读性。标识符命名的良好习惯标识符命名的良好习惯见名知意见名知意,即通过变即通过变量名就知道变量值的含义。通常应选择能表示量名就知道变量值的含义。通常应选择能表示数据含义的英文单词或缩写作变量名,或数据含义的英文单词或缩写作变量名,或汉语拼音字头作变量名
8、。汉语拼音字头作变量名。例如,例如,name/xm姓名)、姓名)、sex/xb性别)、性别)、age/nl年龄)、年龄)、salary/gz工资)。工资)。(4)命名风格:命名风格:my_car,myCar,iMyCar,dMyCar3.变量定义方式:变量定义方式:;例如:例如:int a,b,c;double x,y,z;4.变量赋值与初始化变量赋值与初始化数据类型数据类型 标识符标识符1(初始值初始值1), ,标识符标识符n(初始值初始值n);数据类型数据类型 标识符标识符1=初始值初始值1, ,标识符标识符n=初始值初始值n;例如:例如:double price=15.5;int siz
9、e=100;5.typedf 用用typedef可以为一个已有的类型名提供一个同可以为一个已有的类型名提供一个同义词义词例如:例如:typedef double profit; typedef int INT,integer; INT a; profit d;2.3.2 常量常量1.整型常量整型常量10进制表示例:进制表示例:132, -3458进制表示例:进制表示例:010, -053616进制表示例:进制表示例:0x7A, -0X3de2.实型常量实型常量(1)定点数形式定点数形式 。它由数字和小数点组成。它由数字和小数点组成。如:如:0.123,.234,0.0等。等。(2)指数形式。如
10、,指数形式。如,123e5或或123E5都表示都表示123105。要注意。要注意E或或e的前面必须要有数字,的前面必须要有数字,且且E后面的指数必须为整数。后面的指数必须为整数。3.字符常量字符常量(1)由一对单引号括起的一个由一对单引号括起的一个字符表示;字符表示;(2)其值为所括起字符在其值为所括起字符在ASCII表中的编码;表中的编码;(3)转义序列表示方法:以反转义序列表示方法:以反斜线斜线()开头,后跟字符的开头,后跟字符的ASCII码值;码值;C+中常用转义序列符.字符串常量字符串常量一对双引号括起的字符序列,字符序一对双引号括起的字符序列,字符序列可以包含空格、转义序列或任何其列
11、可以包含空格、转义序列或任何其他字符,这些字符不一定是他字符,这些字符不一定是C+字符字符集中的字符,只要集中的字符,只要C+编译器支持即编译器支持即可可.例如:例如:“This is a string;” “How do you do?” “I am a student.”字符串常量字符串常量字符常量字符常量 字符没有结束符字符没有结束符 字符串有一个结束符,该结束符用字符串有一个结束符,该结束符用0表示表示 用双引号括起用双引号括起 用单引号括起用单引号括起 由一维数组存放由一维数组存放由一个字符型变量存放由一个字符型变量存放 字符串常量字符串常量“a在内存中占用两在内存中占用两个字节个字
12、节字符常量字符常量a在内存中占在内存中占用用 一个字节一个字节 可进行连接、拷贝运算可进行连接、拷贝运算可进行加、减法运算可进行加、减法运算串常量与字符常量的区别:串常量与字符常量的区别: 5.布尔常量布尔常量仅有两个: false假和true真) 或:1 (真) 0 (假)6.枚举常量枚举常量枚举声明枚举声明: enum ;由若干个枚举符组成,多个枚举符之间由若干个枚举符组成,多个枚举符之间用逗号分隔;用逗号分隔;枚举符是用标识符表示的整型常量,又称枚举常枚举符是用标识符表示的整型常量,又称枚举常量;量;枚举常量的值默认为最前边的一个为枚举常量的值默认为最前边的一个为0,其后的值,其后的值依
13、次加依次加1;枚举常量的值也可显式定义,未显式定义的则在枚举常量的值也可显式定义,未显式定义的则在前一个值的基础上加前一个值的基础上加1;例如:例如:enum day Sun,Mon,Tue,Wed,Thu,Fri,Sat; enum day Sun=7,Mon=1, Tue,Wed,Tur,Fri,Sat;2.3.3 常量定义常量定义定义方法:使用类型说明符定义方法:使用类型说明符const;例如:例如:const int size=80;定义的符号常量必须初始化;定义的符号常量必须初始化;一个符号常量可看作是一个只读变一个符号常量可看作是一个只读变量,由量,由const定义的常量的值不可以
14、定义的常量的值不可以改变;改变;2.3.4 宏定义的使用例:例:define pi 3.14说明:define 在c+中不常用,已经被const所取代2.4 运算符与表达式在程序中,表达式是计算求值的基本单位,它在程序中,表达式是计算求值的基本单位,它是由运算符和运算数组成的式子。运算符是表是由运算符和运算数组成的式子。运算符是表示进行某种运算的符号。运算数包含常量、变示进行某种运算的符号。运算数包含常量、变量和函数等。量和函数等。C+语言的运算符按其在表达式中与运算语言的运算符按其在表达式中与运算对象的关系连接运算对象的个数可分为:对象的关系连接运算对象的个数可分为: 单目运算一元运算符,只
15、需一个操作数)单目运算一元运算符,只需一个操作数) 双目运算二元运算符,需两个操作数)双目运算二元运算符,需两个操作数) 三目运算三元运算符,需三个操作数)三目运算三元运算符,需三个操作数) 按其在表达式中所起的作用又可分为:按其在表达式中所起的作用又可分为: 算术运算符算术运算符 + - * / % 关系运算符关系运算符 = = != 逻辑运算符逻辑运算符 ! & | 位运算符位运算符 | & 自增自减运算符自增自减运算符 + - 赋值运算符赋值运算符 = 及其扩展(及其扩展(+= -= *= /= %= 等)等) 条件运算符条件运算符 ? : 指针运算符指针运算符 * 和和 & 逗号运算符
16、逗号运算符 , 分量运算符分量运算符 * - 函数调用运算符()函数调用运算符() 下标运算符下标运算符 求字节运算符求字节运算符 sizeof 强制类型转换运算符:(强制类型转换运算符:(type) 2.2.左值和右值左值和右值 左左值值left left value,value,缩缩写写为为lvaluelvalue是是能能出出现现在在赋赋值值表表达达式式左左边边的的表表达达式式。左左值值表表达达式式具具有有存存放放数数据据的的空空间间,而而且且存存放放是是允许的。例如:允许的。例如: int a=3; /a int a=3; /a是变量,所以是变量,所以a a是左值是左值 const co
17、nst int int b=4; b=4; /b/b是是常常量量,所所以以b b不不是是左值左值 显显然然常常量量不不是是左左值值,因因为为c+c+规规定定常常量量的的值一旦确定就不能更改。值一旦确定就不能更改。右值右值right value,right value,缩写为缩写为rvaluervalue只能出现在赋值表只能出现在赋值表达式的右边。左值表达式也可以作为右值表达式。例如:达式的右边。左值表达式也可以作为右值表达式。例如: int a,b=6; int a,b=6; a=b;/ b a=b;/ b是变量,所以是左值,此处作为右值。是变量,所以是左值,此处作为右值。 a=8;/ 8 a
18、=8;/ 8是常量,只能作右值,不能作为左值。是常量,只能作右值,不能作为左值。表达式可产生左值、右值或不产生值。例如:表达式可产生左值、右值或不产生值。例如: int a; int a; (a=4)=28; (a=4)=28; /a=4 /a=4是左值表达式,可以被赋以值是左值表达式,可以被赋以值2828。 /* 28 /* 28是右值表达式,而是右值表达式,而a=4a=4是左值表达式是左值表达式C+C+的语法的语法规定),所以可以放在赋值语句的左边。该语句表示规定),所以可以放在赋值语句的左边。该语句表示a a的的值使用值使用2828代替刚刚赋给的值代替刚刚赋给的值4 4。*/ */ 2.
19、5 数值运算符与数值表达式 +(加法运算符,或正值运算符,如(加法运算符,或正值运算符,如1+2,+3) - (减法运算符,或负值运算符,如(减法运算符,或负值运算符,如1-2,-3) *(乘法运算符,如(乘法运算符,如1*2) / (除法运算符,如(除法运算符,如1/2) 两整数相除,结果取整。两整数相除,结果取整。 如:如:5/2结果为结果为2;1/2为为0 浮点数参与除法运算,结果是浮点数。浮点数参与除法运算,结果是浮点数。 如:如:5.0/2.0结果为结果为2.5; 1.0/2.0为为 0.5 %(模运算符或称求余运算符,如(模运算符或称求余运算符,如7%3=1) 只能对整数进行操作。
20、只能对整数进行操作。算术类型转换数据类型转换C+中数据类型转换有两类,即隐式类型转换和显式类型转换。1.隐式类型转换隐式类型转换是由编译器自动完成的类型转换。当编译器遇到不同类型的数据参与同一运算时,会自动将它们转换为相同类型后再进行运算,赋值时会把所赋值的类型转换为与被赋值变量类型一样。隐式类型转换按从低到高的顺序进行,如图2-1所示。 charshortintlong intunsigned charunsigned shortunsigned int unsigned longfloatdoublelong double 2. 显式类型转换显式类型转换是由程序员显式指出的类型转换,转换形
21、式有两种: 类型名表达式)(类型名表达式这里的“类型名是任何合法的C+数据类型,例如float、int等。通过类型的显式转换可以将“表达式转换成适当的类型。例如:double f=3.6;int n=(int)f;这样n为3。 2.6 赋值运算2.6.1 赋值运算符赋值运算符(1赋值运算符赋值运算符“=”的一般格式为:的一般格式为: 变量变量=表达式;表达式;表示将其右侧的表达式求出结果,赋给其左侧的表示将其右侧的表达式求出结果,赋给其左侧的变量。变量。 例如:例如:int i;i=3*(4+5); /i的值变为的值变为27(2赋值表达式本身的运算结果是右侧表达式的值,而赋值表达式本身的运算结
22、果是右侧表达式的值,而结果类型是左侧变量的数据类型。结果类型是左侧变量的数据类型。 例如:例如:int i=1.2*3; /结果为结果为3,而不是,而不是3.6 (3赋赋值值运运算算符符的的结结合合性性是是从从右右至至左左的的,因因而而,C+程程序序中中可可以以出出现现连连续续赋赋值值的的情情况况。例例如如,下下面面的的赋赋值是合法的:值是合法的:int i,j,k;i=j=k=10; /i,j,k都赋值为都赋值为10(4复合赋值运算符:复合赋值运算符:+=(加赋值),(加赋值),-=(减赋值),(减赋值),*=(乘赋值),(乘赋值),/=(除赋值),(除赋值),%=(取模赋值),(取模赋值)
23、,=(右移赋值),(右移赋值),&=(与赋值),(与赋值),=(异或赋值),(异或赋值), |=(或赋值)(或赋值) 它们的含义如下:它们的含义如下:a+=b等价于等价于 a=a+ba-=b 等价于等价于 a=a-ba*=b 等价于等价于 a=a*ba/=b 等价于等价于 a=a/ba%=b 等价于等价于 a=a%b例如:例如:int a=12;a+=a;表示表示a=(a+a)=(12+12)=24; 又例如:又例如:int a=12;a+=a-=a*=a;表示表示a=a*a /a=12*12=144a=a-a /a=144-144=0a=a+a /a=0+0=02.6.2 溢出进行算术运算和
24、赋值运算时,很可能溢出结果。进行算术运算和赋值运算时,很可能溢出结果。发生溢出的原因:发生溢出的原因: 是由于一个变量被赋予一个超出其数值类型表示范围是由于一个变量被赋予一个超出其数值类型表示范围的数值。的数值。数值溢出不会引起编译错误,但会使运行结果发生偏差数值溢出不会引起编译错误,但会使运行结果发生偏差例如:在例如:在16位机器上进行如下操作:位机器上进行如下操作: int weight=42896; 变量变量weight将得不到将得不到42896,而是得到,而是得到-22640。因。因为有符号整数的表示范围是为有符号整数的表示范围是-3276832767。所以。所以它只能得到它只能得到4
25、2896的补码的补码-22640 (42896-65536) 思考如下的问题:思考如下的问题: 在在16位机器中,做如下操作:位机器中,做如下操作: int x=142896; 变量变量x将会得到什么数?将会得到什么数?如果x是2个字节的整数,得到的值为:11824因为:142896=265536+118242.6.3 自增、自减运算符(1自增(自增(+)、自减()、自减(-)运算符为变量的增)运算符为变量的增1和减和减1提供了紧凑格式。提供了紧凑格式。(2自增、自减运算符都是单目运算符,其作用是使变自增、自减运算符都是单目运算符,其作用是使变量的值增量的值增1或减或减1。(3自增、自减运算符
26、有四种应用格式:自增、自减运算符有四种应用格式:b=a+; 等价于等价于 b=a;a=a+1;b=a-; 等价于等价于 b=a;a=a-1;(运算符后置用法,代表先使用变量,然后对变量增值)(运算符后置用法,代表先使用变量,然后对变量增值)b=+a; 等价于等价于 a=a+1;b=a;b=-a; 等价于等价于 a=a-1;b=a;(运算符前置用法,代表先对变量增值,再使用变(运算符前置用法,代表先对变量增值,再使用变量)量) 2.7 关系与逻辑运算符2.7.1 关系运算符关系运算符1.关系运算符用于两个值进行比较,关系运算符用于两个值进行比较, 运算结果为运算结果为true1或或false0)
27、。)。 C+中的关系运算符如下:中的关系运算符如下: (小于),(小于), (大于),(大于), =(大于等于),(大于等于),=(等于),(等于), !=(不等于),(不等于), 2.关系运算符都是双目运算符,其结合性是从左到右,关系运算符都是双目运算符,其结合性是从左到右,、=运算符的优先级相同,运算符的优先级相同,=和和!=运算符的运算符的优先级相同,前者运算的优先级高于后者。优先级相同,前者运算的优先级高于后者。3.关系运算符的优先级低于算术运算符。关系运算符的优先级低于算术运算符。例如:例如:a+bc等价于等价于(a+b)c a!=bc 等价于等价于a!=(bc) 2.7.2 逻辑运
28、算符运算符&(逻辑与),(逻辑与), |(逻辑或),!(逻辑非)(逻辑或),!(逻辑非)逻辑表达式的结果为真则为逻辑表达式的结果为真则为1,结果为假则为,结果为假则为0。逻辑非(!)是单目运算符,逻辑与(逻辑非(!)是单目运算符,逻辑与(&)与逻辑)与逻辑或(或(|)为双目运算符。)为双目运算符。逻辑非的优先级最高,逻辑与次之,逻辑或最低。逻辑非的优先级最高,逻辑与次之,逻辑或最低。逻辑运算真值表如表逻辑运算真值表如表2-3所示。所示。 aba&ba|b!a!b0000110非非00110非非000101非非0非非01100表2-3 逻辑运算真值真为非0,假为0)如果多个表达使用如果多个表达使
29、用&连接,则一个假表达式将使整连接,则一个假表达式将使整个表达式的值为假个表达式的值为假( (此处需要处理逻辑知识此处需要处理逻辑知识) )。例如:例如: int n=3,m=6; int n=3,m=6; if(n4&m+4&m+10) cout cout“m should not changed.nm should not changed.n”; ; cout cout“m=m=”mendl;m4n4的比较值为的比较值为0 0,所以整个表达式的值不,所以整个表达式的值不用看后面就知道为用看后面就知道为0 0。因而,后面的表达式不被执。因而,后面的表达式不被执行。这样行。这样,m,m的值是的
30、值是6 6而不是而不是7 7。 2.7.3 2.7.3 短路表达式短路表达式同理,如果多个表达式用 | 连接,则第一个表达式为真,整个连接都为真。例如:t=10;If ( t80 ) cout“*:b)?a:b)上面例子定义了一个求两个数上面例子定义了一个求两个数a和和b中最大值,中最大值,其中决定哪一个是最大值用了条件运算符。其中决定哪一个是最大值用了条件运算符。(2条件运算符的结合性是自右向左。条件运算符的结合性是自右向左。例如条件表达式:例如条件表达式:ab?a:cd?c:d相当于相当于ab?a:(cd?c:d)(3条条件件运运算算符符的的优优先先级级别别高高于于赋赋值值运运算算符符,低
31、低于于关关系系运算符和算术运算符。运算符和算术运算符。例如条件表达式:例如条件表达式:ab?a-b:b-a相当于相当于ab?(a-b):(b-a) 2.8.2 逗号表达式逗号表达式 (1) 逗号表达式的语法为:逗号表达式的语法为: 表达式表达式1,表达式,表达式2,.表达式表达式n C+顺序计算表达式顺序计算表达式1 ,表达式,表达式2,.表达式表达式n的值。的值。例如:例如: int a,b,c; a=1,b=a+2,c=b+3; 由于按顺序求值,所以能够保证由于按顺序求值,所以能够保证b一定在一定在a赋值之后,赋值之后,c一定在一定在b赋值之后。该逗号表达式可以用下面赋值之后。该逗号表达式
32、可以用下面3个有序的个有序的赋值语句来表示:赋值语句来表示: a=1; b=a+2; c=b+3; 逗号表达式是有值的,这一点是语句所不能代替的。逗号表达式是有值的,这一点是语句所不能代替的。(2) 逗号表达式的值为第n个子表达式的值,即表达式n的值。例如: int a,b,c,d; d=(a=1,b=a+2,c=b+3); coutdendl; 输出结果为: 6 上例中输出的结果d即为c的值。 逗号表达式还可以用于函数调用中的参数。例如: func(n,(j=1,j+4),k); 该函数调用3个参数,中间的参数是一个逗号表达式。括号是必须的,否则,该函数有4个参数了。 C+中,如果逗号表达式
33、的最后一个表达式为左值,则该逗号表达式为左值。例如: (a=1,b,c+1,d)=5; /ok:即d=5 2.9 sizeof运算符求字运算符求字节运算符)运算符)(1sizeof运运算算符符是是单单目目运运算算符符,用用于于计计算算运运算算对对象象在在内内存中所占字节的多少,它有两种形式:存中所占字节的多少,它有两种形式:sizeof (类型标识符);(类型标识符);sizeof 表达式;表达式;(2sizeof可可以以接接受受的的类类型型标标识识符符很很多多,如如sizeofint表示求整型数据在内存中所占字节数。表示求整型数据在内存中所占字节数。 例例如如:int a,则则sizeofa
34、表表示示求求变变量量a在在内内存存中中所占字节数。所占字节数。例例如如:int a10,则则sizeofa表表示示求求数数组组a在在内内存中所占字节数。存中所占字节数。 2.10 求值次序与副作用求值次序与副作用 1.不同的编译器求值顺序不同;不同的编译器求值顺序不同; 2.求值顺序使交换律失去作用;求值顺序使交换律失去作用; 加法操作我们都知道加法操作我们都知道a+b=b+a。也就是说,交换律成立。而在。也就是说,交换律成立。而在C+中,对简单的表达式,交换律是成立的,但对复合表达式,交中,对简单的表达式,交换律是成立的,但对复合表达式,交换律未必成立。例如:当换律未必成立。例如:当int
35、a=3,b=5,c;时时 c=a*b+ +b; 与:与: c=+b+a*b; 在在VC中,运行结果前者为中,运行结果前者为21,后者为,后者为24。 3.求值顺序使括号失去作用求值顺序使括号失去作用 在表达式中,括号的优先级是最高的。在表达式中,括号的优先级是最高的。C+中,简单中,简单 的表达式括号优先可以做到,但复合表达式未必如此。例如:的表达式括号优先可以做到,但复合表达式未必如此。例如: int a=3,b=5,c; c=+b*(a+b); 实际在VC中得数为54而不是48。这是因为先将括号外面的表达式求值。4.消除副作用 在我们举的例子中,+b是引起副作用的主要操作。+b具有变量b的修改副作用和它所提供的表达式值两个操作。同样赋值表达式也会引起副作用。例如: int a,b=20; a=(b=25)+b; 解决表达式副作用的方法是分解表达式语句,即将复合表达式语句写成几个简单的表达式语句。例如,前面有副作用的表达式语句可以分解为下面的两个表达式: c=b+a*b;b+;或者: b+;c=b+a*b;