《第二章基本数据类型、运算符和表达式.ppt》由会员分享,可在线阅读,更多相关《第二章基本数据类型、运算符和表达式.ppt(44页珍藏版)》请在三一办公上搜索。
1、第二章 基本数据类型、运算符和表达式,2.1 C语言的数据类型2.1.1 概述 程序设计主要解决两个问题:一个是动作,即怎样做的问题,这由语句来实现;另一个是动作的对象,即数据的存放问题,这由数据类型来决定。世界上著名的计算机科学家沃斯(N.Wirth)提出这样一个公式:程序=数据结构+算法为什么要规定数据类型呢?不同数据类型的数据在内存中占据不同长度的存储区(2)一种数据类型对应着一个值的范围。(3)一种数据类型对应着一个运算集。,2.1.2 数据类型,数据类型,1,2.2 常量(2)常量:程序运行过程中其值不发生变化的量。三类常量:数值、字符和字符串。2.2.1 数值常量一、整数常量的表示
2、1、计数制的通用表示方法A=an-1bn-1 an-2bn-2.a1b1 a0b0 a-1b-1 a-2b-2.a-mb-m 基数(b):所含数码的个数权(bx):表明数码所在的位置数码:0 b-1,整数常量,实数常量,数值常量,二进制数:基数:2权:2x数码:0 1例如:1010.11=123 022121 020 12-1 12-2=10.75二进制数权值:128 64 32 16 8 4 2 1注:计算机中使用二进制编码表示数据,且只存在二进制。2、十进制表示基数:10权:10 x数码:0 9例如:123.45=11022101 3100410-1510-2,3、八进制表示基数:8权:8
3、x数码:0 7例如:023=2813 80=19注:八进制是二进制的短格式计数法,一位对三位。例如:023对应的二进制数为010 011注:C语言中八进制数第一个数字必须为0(八进制标志)例如:0213-030+056-01234、十六进制表示基数:16权:16X数码:0 9,A,B,C,D,E,F例如:0XBF3C=1116315162316112160=48956,注:十六进制是二进制的短格式计数法,一位对四位。例如:0XBF3C对应的二进制数为1011 1111 0011 1100注:十六进制数前两个数字必须为0X(十六进制标志)例如:0X213-0X30+0X56-0X12A二、整数常
4、量的几种表示方式之间的转换,红色:连续除基数,取余数直到商为零浅蓝:按权值位展开。黄色:借助二进制数转换。,1、十进制变八进制或十六进制(红色)(1)将139变为八进制数(0213)8 139 8 17 余3 8 2 余1 0 余2将3158变为十六进制数(0XC56)2、八进制或十六进制变十进制(浅蓝)(1)将0213变为十进制数(139)0213=282+181+380=139(2)将0XC56变为十进制数(3158)3、八进制与十六进制变换(黄色)(1)将0X1A3变成八进制数(0643)P19(2)将0334变为十六进制数(0XDC)P19,三、整数常量的取值范围短整型数:基本整型数:
5、长整型数:四、溢出 整数的值超出了所能表示的范围,有符号短整型(16位):-32768+32767,无符号短整型(16位):0 65535,有符号整型(16位):-32768+32767,无符号整型(16位):0 65535,有符号长整型(32位):-2147483648+2147483647,无符号长整型(32位):0 4294967295,五、实数 实数只使用十进制形式表示 两种表示方法:小数形式与指数形式1、小数形式:由整数部分、小数点、小数部分组成 2.718 0.123 123.0.123 123.0.02、指数形式:+整数部分.小数部分+e前部分称为尾数,表示实数的有效值,符号表示
6、整体的正负。e后部分称为阶码,表示小数点在尾数基础上的移动位数,符号表示移动的方向 例如:-3.14e2,3.14e-2实数的分类,单精度,例如:3.1415f双精度,例如:3.1415长双精度,例如:3.1415L,实数取其值的绝对值范围。当实数超出它的类型所能表示的范围时产生溢出。如果实数的绝对值小于所能表示的最小值则产生下溢,例如:实数1.7e-309和-1.7e-309均产生下溢,因为|1.7e-309|1.7e+308|。上溢时将产生错误的结果。实数又分为单精度(float)、双精度(double)和长双精度(long double)三类。实数的缺省类型为双精度数(double型);
7、在实数后面加后缀字母f或F表示单精度数(float型),例如3.14159F;在实数后面加后缀字母l或L表示长双精度数(long double型),例如1.7e+309L.,单精度实数具有67位十进制有效数字;双精度实数具有1516位十进制有效数字;长双精度数具有1819位十进制有效数字。,2.2.2 字符常量 一对单引号括起来的单一字符。例如:A,2,+字符常量在内存中占一个字节存放,存放的值为该字符的ASCII码值。美国标准信息交换码ASCII码(American Standard Code for Information Interchange),前32个,0 x00 x1f为控制字符
8、是空格,编码为OX203编码为OX339编码为OX39A编码为OX41Z编码为OX5Aa编码为OX61z编码为OX7A,2.2.3 转义字符用于表示一些没法表示的字符,例如控制字符、单引号等两种表示形式:1、反斜杠后面跟一个字符例如:0 空字符n 换行 t 横向跳格 b 退格 r 回车 字符 单引号 双引号 2、反斜杠后面跟一个字符的ASCII码(两位十六进制数 xhh或三位八进制数ddd)例如:换行字符可以表示为:n、012、12、XA,2.2.4 字符串常量 一对双引号括起来的零个或多个的字符序列,字符序列中的字符个数称为字符串的长度。例如:this is a stringn this i
9、s acprogram 长度为0的字符串(即一个字符都没有的字符串)称为空串,表示为(一对紧连的双引号)。在存储字符串常量时,由系统在字符串的末尾自动加个空字符0作为字符串的结束标志 例如:有一个字符串“CHINA”,它在内存中的实际存储如下所示。字符串如果有n个字符,则占用n+1个内存空间。,字符串必须写成一行,如下写法是错误的:printf(Hello,how are you?);字符串常数必须写成一行。如果一行写不下,则有两种方法可以将行扩展到下一行。printf(hello,how are you?);两个字符串中间只有空白字符(分隔符),认为这是一个字符串。2、续行符 printf(
10、hello,how are you?);2.2.5 符号常量 将一个常量定义为一个标识符,这个标识符可以代替对应的常量,称为符号常量。例如:#define PI 3.1415926(符号常量名使用大写字母),使用符号常量的优点:1、输入很长的常量可以避免出错,简化输入。2、含义直观。3、修改容易例如:计算相同半径下的圆周长、圆面积和圆球体积。#define PI 3.14159main()main()float l,s,v,r;float l,s,v,r;printf(input r:);printf(input r:);scanf(%f,2.3 变量及数据类型2.3.1 变量和变量的地址变量
11、:程序运行中可以改变的量。本质是内存中的一块存储区,变量名:是这块存储区的首地址的符号标识(通过变量名 找到这块存储区在内存中的位置,找到该块存储 区内存储的内容)注:使用变量名表示存储的数据。使用&变量名表示地址。变量类型:表明这块存储区的大小,以及施加在这块存储 区内存储的内容上的操作范围,在程序运行时,变量的值存储在一定的存储单元中,为此,须弄清楚变量名和变量值这两个不同的概念,如左图所示。存储某变量值的存储单元的首地址称为变量的地址。如右图所示的单精度实型变量average,是具有4个字节的存储单元,它们分别是单元40004003,而4000就称为变量average的首地址。在C语言中
12、,变量的地址用变量名前加&符号表示,即&average,或者说&average的值就是4000。变量名 float average&average4000 sum 变量值 4001 4002 4003 存储单元,30,2.3.2 基本数据类型变量一、整型变量 包括基本整型、短整型和长整型。ANSI C规定long不短于int,short不长于int。具体实现取决于计算机系统。1、整型变量的类型标识符 有符号短整型:signed short int 无符号短整型:unsigned short int 有符号基本整型:signed int 无符号基本整型:unsigned int 有符号长整型:s
13、igned long int 无符号长整型:unsigned long int 例如:int a;取值范围为-32768 32767 unsigned int b;取值范围为0 65535,二、计算机中数的表示无符号数表示 00000000=00000000000000000=0 11111111=2551111111111111111=65535 表示有符号数加正负号用0和1代表正负用某种编码方式使符号位也直接参与运算,不用特殊处理并得到正确结果 机器数:符号数值化了的数(最高位为符号位,1表示负号,0表示正号,其余为真值)原码表示法:符号+绝对值例如:+3原码=0 0000011=03H-
14、3原码=1 0000011=83H+0原码=0 0000000=00H-0原码=1 0000000=80H,八位,十六位,补码表示法:计算机中有符号数用补码表示正数的补码=正数的原码负数的补码=该负数相对应的正数的补码按位取反再加一例如:-46补码=?46补码=0010 1110 1101 0001(按位取反)1101 0010=D2H(加一)n位补码的表数范围:-2n-1 N 2n-1-1n=8-128 N 127n=16-32768 N 32767,三、实型变量 实型变量为:单精度型、双精度型和长双精度型。单精度:float(四个字节存储)双精度:double(八个字节存储)长双精度:lo
15、ng double(字节数8,取决于计算机系统)取值范围:单精度型:有67位有效数字,范围约为|3.4e-38|3.4e+38|双精度型:有1516位有效数字,范围约为|1.7e-308|1.7e+308|长双精度型:如Turbo C中的长双精度型变量的值在内存 中占10个字节)。四、字符变量 用于存放字符常量,存放的是字符的ASCII码。类型标识符为char。,2.3.3 变量说明变量遵循先定义(说明)后使用的原则,变量说明的目的:在编译时便于发现未经定义的变量名。(2)根据类型信息来检查对变量施加的运算是否合理。(3)编译时根据类型为变量分配固定长度的存储单元,并 确定数据在内存中的表示方
16、法。变量说明形式:存储类别 存储类别决定变量的存储位置,同时也决定变量的生存期和作用域。数据类型用于指明变量名表中所列变量的数据类型。例如:int number,score;unsigned long distance;,【例2.1】不同整型变量的混合运算。main()int a,b,c,d,x,y;unsigned int e;a=20;b=-15;c=50;d=-10;e=25;x=a+b+e;y=c+d+e;printf(na+b+e=%d,c+d+e=%dn,x,y);运行结果为:a+b+e=30,c+d+e=65,【例2.2】整型数据的溢出问题。main()int a,x;unsig
17、ned int b,y;a=3;b=65532;x=a+b;y=a+b;printf(x=%d,y=%un,x,y);运行结果为:x=-1,y=65535 0000000000000011 3 a(+)1111111111111100 65532 b 1111111111111111,【例2.3】字符型数据和整型数的混合运算。main()char c1,c2,c3;c1=A+3;c2=65;c3=A;printf(%c,%c,%cn,c1,c2,c3);printf(%d,%d,%dn,c1,c2,c3);运行结果如下:D,A,A68,65,65,2.3.4 变量的初始化 变量说明只是指定了变
18、量的名字和数据类型,并没有给它们赋初值。但程序中有些变量在使用前必须赋初值例如,作为计数器(n=n+1)使用的整型变量n通常要置初值0 在C语言程序中,没有赋初值的变量并不意味着该变量中就没有数值,因为该变量所标识的存储单元中还保留着以前使用该单元时留下的内容,只是尚未对该变量定义特定值。于是,直接引用该变量就会产生莫名其妙的结果。(没有赋值的变量内存单元会有随机值存在)变量赋初值的一般形式:=,.例如:int n=0,s=1;double price=35.5;int x,y=10,z;,2.4 运算符和表达式2.4.1 概述运算符:C语言中用于描述数据运算的特殊符号。操作数:运算符的运算对
19、象(常量、变量、函数等)。表达式:用运算符将C语言的各种运算对象连接起来,组成符合C语 言语法要求的式子(一个常量或变量也可称为表达式)。目:对一个运算符而言,参加运算的操作数的个数(单、双、三)例如:(a+b)*sin(x)+2优先级:运算符的优先级。规定表达式中不同运算符相邻出现时,运算符的计算顺序。优先级高的运算符先进行计算。结合性:C语言特有的、用来规定同样优先级的运算符相邻出现时 表达式的计算方式(计算方向)。例如:a+b*c-d(a+(b*c)-d-i+-(i+)注:括号可以用来改变表达式的优先级和结合方式,2.4.2 算术运算符和算术表达式1.基本算术运算符+加法或正值运算符-减
20、法或负值运算符*乘法运算符/除法运算符%求余数运算符(1)整数除法和实数除法整数除:两个操作数全是整数,商为整数,小数部分被舍弃。例如:5/2 2-10/3-3实数除:两个操作数只要有一个是实数,商为实数。例如:3.0/5.0 0.63/5.0 0.6(2)关于求余数运算两个操作数必须全为整数,结果为整数,符号与被除数相同例如:53%7 453%-7 4-53%-7-4,(3)混合运算运算符两侧的数据类型可以不同,系统先将两个运算对象转换成相同的数据类型,再进行实际计算。这种由混合运算引起的类型转换是自动进行的。例如:a+2.718*b+10-5%2*(a+b)/*设a和b是实型变量*/转换原
21、则:表示范围小的类型转换为表示范围大的类型2.自增、自减运算符“+”和“-”功能:将一个变量加1或减1,常用来修改计数次数、下标或指针。i+i i-i例如:int x,a=5;x=a+x=a,a=a+1 x=a-x=a,a=a-1x=+a a=a+1,x=a x=-a a=a-1,x=a(1)操作数必须是变量“+”和“-”运算符的操作数只能是变 量,而不能是常量或表达式,例如:25+/*是不合法的*/(i+j)+/*是不合法的*/,(2)单目运算符,优先级与取负数运算符“-”相同,结合方向是 从右至左。例如:int i=4;printf(“%d”,-i+);输出-4,i最终等于5。相当于pri
22、ntf(“%d”,-(i+);注意:(1)优先级和结合性(+、-、-)(*、/、%)(+、-)单目运算符+、-和-是从右至左结合的,+、-、*、/和%是从左至右结合的。(2)书写表达式要使用括号使表述清晰例如:i+j写成(i+)+j,2.4.3 赋值运算符和赋值表达式赋值:把表达式的值存入变量所对应的存储空间1、简单赋值运算符“=”格式:变量名=表达式(*)如果“=”两边的类型不一致,系统会将右边的数据转换为左边 变量的类型(截取或扩展)。例如:int i,j;double d=2.6;char c1=a,c2;j=c1;c2=102;i=d+3;(*)结合性为从右至左。例如:x=y=5 x=
23、(y=5),2、算术复合赋值运算符(3)+=、-=、*=、/=、%=、=、2.4.4 关系运算符和关系表达式关系运算:对两个操作数进行比较的运算,由关系运算 符实现。大于=大于等于 小于=小于等于=等于!=不等于,(1)优先级与结合性(=c+dxy!=za=xyz例如:int x=2,y=3;求z1和z2的值z1=0=x=9 z2=3-1!=x+1=y+2,(a+b)(c+d),(xy)!=z,a=(xy)z),z1=(0=x)=9),z2=(3-1)!=(x+1)=(y+2),2.4.5 逻辑运算符和逻辑表达式逻辑运算符用来描述同时满足、只要满足其一、相反的条件等关系&逻辑与 逻辑或!逻辑非
24、(1)逻辑运算真值表(2)优先级与结合性(!)(&)(|)(!、+、-、-)算术运算关系运算&|赋值运算!是右结合方向,&与|是左结合方向,例如:写出下列表达式的执行顺序xy&a=a&c9注意:(*)在计算逻辑表达式时,并不是所有的表达式都要被求解。逻辑与:如果第一个操作数被判定为“假”,系统不再判定或 求解第二操作数。逻辑或:如果第一个操作数被判定为“真”,系统不再判定或 求解第二操作数。例如:假设n1、n2、n3、n4、x、y的值分别为1、2、3、4、1、1,则求解表达式(x=n1n2)&(y=n3n4)后x和y的值(*)条件或逻辑表达式用整数“”表示结果“逻辑真”、用“”表示 结果“逻辑
25、假”。(*)在判断一个数据的“真”或“假”时,却以和非为根据:如果 为,则判定为“逻辑假”;如果为非,则判定为“逻辑真”,例如:x=10、y=5、z=a求下列表达式的值!xy&z!x|010&0|32.4.6 条件运算符(1)格式:表达式1?表达式2:表达式3(2)运算规则:如果“表达式1”的值为非0(即逻辑真),则运算结果等于“表达式2”的值;否则,运算结果等于“表达式3”的值(3)优先级与结合性仅高于赋值运算符、逗号运算符,右结合性,例如:从键盘上输入一个字符,如果它是大写字母,则把 它转换成小写字母输出;否则,直接输出。main()char ch;printf(Input a chara
26、cter:);scanf(%c,例如:写出下列表达式的计算顺序x0?1:x0?1:(x0?-1:0),2.4.7 其它运算符1、逗号运算符“,”(1)格式表达式1,表达式2,.(2)功能 依次计算表达式,以最后一个表达式的值作为逗号表达式的值。该表达式用于只允许出现一个表达式的地方计算多个表达式的值,主要用于循环语句的控制部分。2、求字节运算符“sizeof”(1)格式 sizeof(数据类型)sizeof(表达式)功能是求表达式的结果或数据类型所占的字节数。,x=1.25,x*4,3*6 结果为整型值18z=(x=6,y=x*2,y+x+10)(x、y、z均为int类型)结果z为整型(int
27、)值28max(a,b),c,d)是一个函数调用表达式。这个函数调 用表达式用了三个实参(a,b)、c、d。例如:sizeof(float)的值为4,表明单精度实型占4个字节。sizeof(2*3)的值为2,表明整型占2个字节。2.5 运算符的优先级和结合性 运算符的优先级和结合性见P48表2-9,2.6 数据类型转换 不同数据类型的数据或变量进行混合运算时,需要进行数据类型转换转换方式有两种:隐式类型转换显式类型转换2.6.1隐式类型转换语言按照一定的类型转换规则自动进行的转换转换规则:,1、运算中将所有char型和short数据都转换成int型,float型转换 成double型(提高运算精度)。2、低级类型向高级类型(占存储空间大)进行转换。3、赋值运算符右端值的类型向左边变量的类型进行转换,2.6.2 显式(强制)类型转换转换方法(类型标识符)表达式例如:x为int型,y为float型,z为char型;求出下表达式的类型 x+y x+(int)y(char)(x+z)(char)x+z,