《c语言第2章c语言基础.ppt》由会员分享,可在线阅读,更多相关《c语言第2章c语言基础.ppt(61页珍藏版)》请在三一办公上搜索。
1、本章要求:,理解变量与常量的概念、掌握变量的定义和使用;掌握常用数据类型的数据在内存中的存放形式;掌握算术运算符、关系运算符、逻辑运算符、赋值运算、逗号运算规则及优先级别;掌握各种表达式的运算及简单的运用;,本章难点:各种数据类型的数据在内存中的存放形式,本章重点:变量与常量的概念、各种表达式的运算,第2章 C语言基础,第2章 基本的程序语句,一、语言的数据类型二、常量三、变量四、运算符与表达式五、数据类型转换,1、语言数据类型概述,一、语言的数据类型,数据的组织形式是数据结构,数据结构的表现形式是数据类型,在程序中表现数据必须指定其数据类型。数据类型决定数据在内存的空间大小,数据的表示形式,
2、数据的取值范围以及可参与运算的种类。C语言的数据类型丰富,可以表示复杂的数据结构。,数据类型,基本类型,构造类型,指针类型空类型,一、语言的数据类型,(int),(char),(float),(double),(void),C语言中的数据有常量和变量之分。常量是在程序运行过程中,其值不能被改变的量。变量是在程序运行过程中,其值可以被改变的。常量和变量是数据的外在存储形式,数据最终以这两种方式之一出现,但它们都要归属于某种数据类型。变量是在程序中定义的,代表某个存储空间及其所存储的数据。,一、语言的数据类型,2、基本数据类型,基本数据类型是构成C语言的数据类型的最基本要素包括:整型(int)实型
3、(float 和 double)字符型(char),例如:整型数据的取值和取值范围类型说明符 数的范围 分配字节数 int-3276832767 2字节 short int/short-3276832767 2字节 long-21474836482147483647 4字节unsigned int/unsigned 065535 2字节unsigned short int 065535 2字节unsigned long int 04294967295 4字节,注意:VisualC+6.0中,基本整型与长整型所占字节数及表示范围对应相同。,一、语言的数据类型,二、常量,(一)数值常量 1.整型常
4、量 在语言中,使用的整常数有八进制、十六进制和十进制三种。(1).十进制整常数。237-568 0 1627(2).八进制整常数 八进制整常数必须以0开头,即以0作为八进制数的前缀。015(十进制为13)0101(十进制为65)079 和 08001,不合法的八进制数,定义:在程序运行时,其值不能被改变的量叫常量。如 5,3.14159,a 等,二、常量,(3).十六进制整数的前缀为0X。0X2A(十进制为42)0XA0(十进制为160)0XFFFF(十进制为65535)以下各数是不合法的十六进制整常数:5A 0X3H,若要表示长整型(long)整数,在数的最后加表示长整型的后缀修饰符号字母“
5、l”。如:125 0125l 0X125l 等价于125、(125)8、(125)16,思考:25和25l的区别?,说明:,前者用2字节存储,后者则使用4个字节存储。,(二)实型常量实型也称为浮点型。实型常量也称为实数或者浮点数。在语言中,实数只采用十进制。它有两种形式:小数形式与指数形式,(1).小数形式 由数码0-9和小数点组成。例如:0.123.123 123.0-123等均为合法的实数。(2).指数形式 由十进制数,加阶码标志“e”或“E”以及阶码组成。其一般形式为a E n 值为 a*10n,二、常量,二、常量,例如:1.25E+3 1.25e+3 1.25103,1250.0,说明
6、:当幂为正数时,正号可以省略。即1.25E+3等价于1.25E3;同一个实数可以有多种表示形式,例如:1250.0可以用0.0125E+5,0.125E+4,1.25E+3,12.5E+2,125E+1。字母e(或E)之前必须有数字,且e后面指数必须为整数。,a E n,二、常量,(三)字符常量,字符常量是用单引号括起来的一个字符。例如a,b,=,+,?都是合法字符常量。在语言中,字符常量有以下特点:1.字符常量只能用单引号括起来,不能用双引号或其它括号;2.字符常量只能是单个字符,不能是字符串;3.字符可以是字符集中任意字符。但数字被定义为字符型之后就不能参与数值运算。,如5和5 是不同的。
7、,二、常量,(四)字符串常量,C语言中的字符串常量是由一对双引号括起来的字符序列。每个字符串最后有一结束标志 0。例如:ABC,A,123lkdf,字符串常量在内存中存储时,系统自动在字符串的末尾加一个“串结束标志“,因此在程序中,长度为n个字符的字符串常量,在内存中占有n+1个字节的存储空间。,二、常量,例如:a与a是C语言中两种完全不同类型的数据。,a,a 0,a与a在内存的存储形式,注意:不要将字符常量和字符串常量混淆,例如,字符串“ABCDEF”有6个字符,存储于内存中时,共占7个字节,最后一个字节为 0,(五)转义字符 转义字符是一种特殊的字符常量。转义字符以反斜线“”开头,后跟一个
8、或几个字符。转义字符主要用来表示那些用一般字符不便于表示的控制代码。常用的转义字符及其含义:(p12)转义字符 转义字符的意义n 回车换行 t 横向跳到下一制表位置v 竖向跳格 b 退格r 回车 f 走纸换页 反斜线符“”单引号符a 鸣铃 ddd 三位八进制数的值所代表的ASCII字符xhh 两位十六进制数所代表的ASCII字符,二、常量,例:main()printf(“a b ctd ebfghin”);printf(“a=65 b=101 c=x41n”);输出结果:,a,b,c,d,e,fghi,a=65 b=A c=A,二、常量,(六)符号常量,符号常量:可以使用一个符号表示一个多次常
9、用的常量 C 语言中使用命令#define来定义:格式:#define 符号常量名标识符 常数表达式 优点:符号常量使程序易于阅读和修改。例如,一个程序中多处用到学生人数60,当有学生人数改变为65,修改这个程序很困难。而使用符号常量,只要将#define NUM 60 改为#define NUM 65,就可以了。,无分号,二、常量,例:求一个半径为r的球的体积和表面积的C程序#define PI 3.14159/*定义PI为符号常量,值为3.1415*/void main()float v,s,r;scanf(“%f”,说明:(1)符号常量名常常用大写字母、变量名用小写字母。(2)符号常量不
10、能在其作用域范围内重新赋值。,二、常量,三、变量,(一)变量的定义,简单定义:在程序运行时,其值能被改变的量叫变量变量包括:一个名字和相应的数据类型 通过名字来引用一个变量,而数据类型则决定了该变量的存储方式和在内存中占据存储单元的大小,说明:变量名和变量值这两个概念的区别 定义:int x=20;,C语言中使用的变量都要作类型强制定义,即要求“先定义,后使用”的原则。其目的:1)保证程序中变量名使用的正确性 2)编译程序为其分配相应的储存单元 3)保证运算的合法性,定义形式:类型说明符 变量名列表;,三、变量,实型变量:1.单精度实型:float a;4个字节 2.双精度实型:double
11、a;8个字节,char ch;/*定义ch为字符型变量*/int i,j;/*定义i,j为基本整型变量*/long k,n,m;/*定义k,n,m为长整型变量*/float x,y,z;/*定义x,y,z单精度实型变量*/double sum,t;/*定义sum,t双精度实型变量*/,三、变量,(二)变量的赋初值,C语言中,当定义一个变量后,系统只是按定义的数据类型分配其相应的存储单元,并不对其单元初始化,如果在赋初值之前直接使用该变量,则是一个不定值。,例如:void main()int k;printf(“k=%dn”,k);,程序运行,输出k的值就是一个无意义的不定值,并在不同系统环境下
12、运行的结果也可能完全不同。,三、变量,赋初值的一般形式为:(1)类型说明符 变量1=值1,变量2=值2,;(2)类型说明符 变量1,变量2,变量3;变量1=值1;变量2=值2;,例如:int a=10,b=10,c=10;等价于 int a,b,c;a=10;b=10;c=10;,注意:在说明中不允许连续赋值,但在变量定义后,可以 使用连续赋值语句初始化;,三、变量,如:int a=b=c=1;是不合法的;int a,b,c;a=b=c=1;是合法的,1.一个字符变量存放字符常量,在内存中是以ASCII 码的形式 存 储的。,字符数据在内存中的存储形式及其使用方法:,2.字符型数据与整型数据的
13、关系:二者可以进行转换。(1)一个字符数据既可以字符形式输出,也可以整数据形式输出。(2)二者可以互相赋值。(3)字符型数据可以进行算术运算。,三、变量,例 1main()char c1,c2;int i;c1=65;c2=66;i=C;printf(“%c,%cn”,c1,c2);printf(“%d,%dn”,c1,c2);printf(“%d,%c”,i,i);,例 2main()char ch;int i;ch=A;ch=ch+32;i=ch;printf(“%d is%cn”,i,ch);printf(“%c is%dn”,ch,ch);,三、变量,四、运算符与表达式,C语言中的运算
14、符:,语言中运算符和表达式数量之多,在高级语言中是少见的,正是丰富的运算符和表达式使语言功能十分完善。这也是C语言的主要特点之一。运算符的种类 C语言的运算符共有十三类,常用运算符及表达式:,算术运算符 根据运算符的性质分类 逻辑运算符 关系运算符 赋值运算符 位运算 单目运算符 根据所需的运算对象即操作数的个数分类 双目运算符 三目运算符,四、运算符与表达式,运算对数据的加工(基本操作)。运算符描述运算的符号,即操作符。运算量操作数,被运算的对象(数据)。表达式由运算符和运算量组成的式子。,语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。,因此,在表达式中,各运算量参与运
15、算的先后顺序不仅要遵守运算符优先级的规定,还要受运算符结合性的制约,以便确定是自左向右进行运算还是自右向左进行运算。,四、运算符与表达式,(一)算术运算符与算术表达式,(1)C语言的基本算术运算符:加法+减法-乘法*除法/求余%其中:求余%运算要求两个运算量均为int 当“/”被用于整数或字符时,结果取整 例如:5/2结果2,1/2的结果0,1.关于%的说明:运算符%两边的操作数必须为整数 结果为两操作数整除后的余数 余数的符号与被除数符号相同 例如:12%(-7)=5(-12)%7=-52.关于/的说明:如果两操作数均为整数,则其结果为整数 如果其中一个操作数为实型数,则其结果为 doubl
16、e 型。例如:6/4=1 6.0/4=1.500000,四、运算符与表达式,+,-运算符为单目运算,要求运算对象只能是变量结合方向:为由右至左。优先级:高于双目运算,可有以下几种形式:+i 变量i自增1后再参与其它运算。i+变量i 参与运算后,i 的值再自增1。-i 变量i自减1后再参与其它运算。i-变量i 参与运算后,i 的值再自减1。,(2)自增,自减运算符 自增运算符:+其功能是使变量的值自增1。自减运算符:-其功能是使变量值自减1。,四、运算符与表达式,例2-3:main()int x,y;x=10;y=+x;printf(“%d,%d”,x,y);,程序运行后,输出结是:11,11,
17、思考:如果将程序的第2行改为:x=10;y=x+;结果如何?,四、运算符与表达式,【注意】:(1)自增自减运算符的优先级较高,和单目运算符相同。其结合方向是“自右向左”(右结合性)。例如:表达式-i+由于“-”和“+”优先级相同,均为右结合性,因此相当于-(i+)。(2)尽管自增自减运算符给程序员带来了方便,但同时也带来了副作用。例如:printf(%d,%dn,i,i+);在不同的编译环境下结果有可能不同。若i的值为3,则结果可能是“3,3”(Visual C+6.0),也可能是“4,3”(TC)。,四、运算符与表达式,四、运算符与表达式,【注意】:(3)例如:i+j C编译在处理时尽可能多
18、地自左而右将若干个字符组成一个运算符(在处理标识符和关键字时也按同一原则处理),将解释为(i+)+j,而不是i+(+j)。,算术表达式,定义:由算术运算符、括弧、内部函数及数据组成的式子,需要掌握的书写原则:(1)表达式中的所有运算符和操作数必须并排书写。不能出现上下标(如x2,x2等)和数学中的分数线。(2)在C表达式中不能省略乘号(如2ab、xy等)。(3)要注意各种运算符的优先级别,为保持运算顺序,在写C表达式时需要适当添加括号(),若要用到库函数,必须按库函数要求书写。,四、运算符与表达式,(二)关系运算符与关系表达式 关系运算符及优先级别 比较两个量的运算符称为关系运算符。在语言中有
19、以下关系运算符:,=,=,!=,关系运算符的优先级:(1)、=、关系运算符 赋值运算符,四、运算符与表达式,关系表达式的一般形式为:表达式 关系运算符 表达式 关系表达式的值是:关系成立为“真”,不成立则为“假”C语言中用“1”表示“真”“0”表示“假”,例如:a+bc-d x3/2 a+1c-i-5*j=k+1 都是合法的关系表达式。,四、运算符与表达式,例如:当 a=5,b=4,c=3 时ac)a!=(c=b)又如:(a=3)(b=5)又如:当 a=5,b=4 时 a=a+(3b),-假(0)-真(1)-假(0)-6,四、运算符与表达式,练习,(三)逻辑运算符与逻辑表达式,语言中提供了三种
20、逻辑运算符!非运算&与运算|或运算,四、运算符与表达式,设a、b均为逻辑值,运算结果:!a 当a为真时,结果为假;当a为假时,结果为真a&b 当且仅当a、b都为真时,结果为真a|b 当且仅当a、b都为假时,结果为假,运算符&和 或运算符|均为双目运算符,具有左结合性。非运算符!为单目运算符,具有右结合性(1)逻辑运算符优先级表示如下:!&|而且:&,|低于关系运算符!高于算术运算符,四、运算符与表达式,按照运算符的优先顺序可以得出:ab&cd!b=c|dc&x+yb,(ab)&(cd),(!b)=c)|(da),(a+b)c)&(x+y)b),(2)逻辑运算的值:逻辑运算的值也为“真”和“假”
21、两种,用“1”和“0”来表示。,四、运算符与表达式,(3)关于逻辑运算的说明 表达式 a&b&c 的求解过程 只有a为真时,才判别b的值;只有a和b均为真时,才判别c的值。只要a为假,就不再判别b和c的值,直接求得表达式的值为假.表达式a|b|c的求解过程 只要a为真,就不再判别b和c的值,直接求得表达式的值为真。只有a为假时,才判别b的值;只有a和b均为假时,才判别c的值.,四、运算符与表达式,如:设a是一合法表达式 0&a 1|a,(四)赋值运算符与赋值表达式,1.简单赋值运算符与表达式 其一般形式为:变量=表达式 功能:计算表达式的值再赋予左边的变量。整个赋值表达式的值为:左边变量的值,
22、例如:x=a+b w=sin(a)+sin(b)赋值运算符的结合方向:由右至左因此 a=b=c=5可理解为:a=(b=(c=5)优先级:低于条件运算符?:,高于逗号运算符,在赋值表达式的未尾加上分号,就构成为赋值语句.,四、运算符与表达式,说明:如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型。具体转换规定如下:1)实型赋予整型,舍去小数部分。2)整型赋予实型,数值不变,但将以浮点形式存放,即增加小数部分(小数部分的值为0)。3)字符型赋予整型,由于字符型为一个字节,整型为二个字节,故将字符的ASCII码值放到整型量的低八位中,高八位为0。4)整型
23、赋予字符型,只把低八位赋予字符量。,四、运算符与表达式,例:用程序验证不同类型变量的赋值的类型转换。void main()int a,b,c=322;float x,y=3.14;char ch1=a,ch2;a=y;x=c;b=ch1;ch2=c;printf(%d,%f,%d,%c,a,x,b,ch2);程序运行结果是:,a=3,x=322.000000,b=97,ch2=B,四、运算符与表达式,在赋值符“=”之前加上其它二目运算符可构成复合赋值符。如:+=,-=,*=,=,%=,=,&=,=,|=,优先级别:仅高于逗号(,)运算符 例如:a+=5 等价于 a=a+5 x*=y+7 等价于
24、 x=x*(y+7)r%=p 等价于 r=r%p 复合赋值符的优先级和结合方向与赋值运算符(=)相同,2.复合赋值运算符与表达式,四、运算符与表达式,(五)逗号运算符和逗号表达式,在语言中逗号“,”也是一种运算符,称为逗号运算符。其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式。其一般形式为:表达式1,表达式2,表达式n 其求值过程是分别求表达式1、表达式2表达式n的值,并以最后一个表达式n的值作为整个逗号表达式的值。,四、运算符与表达式,例题2-5 main()int a=2,b=4,c=6,x,y,z;y=(x=a+b),(b+c);z=(y=(x=a+b),(b+c);prin
25、tf(y=%d,x=%d,z=%d,y,x,z);,结果:y=6,x=6,z=10,四、运算符与表达式,运算规则:,四、运算符与表达式,(五)位运算,与 或 异或 取反,其运算过程为:56(00111000)56(00111000)199(11000111),1.按位取反【格式】x,四、运算符与表达式,【例2-2】分析下面程序的运行结果main()unsigned char x=56,y;y=x;printf(%d n,y);,2.按位与【格式】x&y,四、运算符与表达式,【例2-3】分析下面程序的运行结果main()unsigned char x=56,y=157,z;z=x 其运算过程为:
26、,3.按位或【格式】x|y,【例2-4】分析下面程序的运行结果main()unsigned char x=56,y=157,z;z=x|y;printf(%d n,z);,四、运算符与表达式,4.按位异或【格式】x y,四、运算符与表达式,【例2-5】分析下面程序的运行结果。main()unsigned char x=56,y=157,z;z=xy;printf(%d n,z);,5.左位移【格式】x要位移的位数【功能】把操作对象的二进制数向左移动指定的位,并在右面补上相应的0,高位溢出。【示例】如x=00001111,y=x2,则y=00111100。【注意】左移会引起数据的变化,具体地说,
27、左移一位相当于对原来的数值乘以2。左移n位相当于对原来的数值乘以2n。但此结论只适用于该数左移被溢出舍弃的高位中不包含1的情况。,四、运算符与表达式,6.右位移【格式】x要位移的位数【功能】把操作对象的二进制数向右移动指定的位,移出的低位舍弃;高位则:(1)对无符号数和有符号中的正数,补0;(2)有符号数中的负数,取决于所使用的系统:补0的称为“逻辑右移”,补1的称为“算术右移”。Turbo C和其它一些C编译采用的是算术右移。【示例】如x=01010001,y=x2,则y=00010100。【注意】右移会引起数据的变化,具体说,右移一位相当于对原来的数值除以2。右移n位相当于对原来的数值除以
28、2n。但此结论只适用于该数右移被溢出舍弃的低位中不包含1的情况。,四、运算符与表达式,【说明】(1)复合赋值运算符除按位取反运算外,其余5个位运算符均可与赋值运算符一起,构成复合赋值运算符:&=、|=、=、=。(a=2相当于a=a2)(2)不同长度数据间的位运算低字节对齐,短数的高字节按最高位补位:对无符号数和有符号中的正数,补0;有符号数中的负数,补1。,四、运算符与表达式,位运算应用:,四、运算符与表达式,清零取数要用与,某位置一可用或若要取反和交换,轻轻松松用异或,课后填空4 5 6 7,五、数据类型转换,1、类型自动转换,图中横向向左的箭头表示必定的转换,纵向的箭头表示当运算对象为不同
29、类型时转换的方向。,2、赋值类型转换(1)当整型数据赋给浮点型变量时,数值上不发生任何变化,但有效位增加。(2)当单、双精度浮点型数据赋给整型变量时,浮点数的小数部分将被舍弃。(3)当长度长的整型数据赋给长度短的变量时,将进行截断赋值。(4)当整型数据赋给长度相同的变量时,将进行原样赋值。,五、数据类型转换,(5)将字符型数据赋给整型变量时,由于字符只占一个字节,而整型变量为4个字节,因此将字符数据(8位)放到整型变量低8位中。将unsigned char型数据赋给unsigned int或int型变量时,高24位补0。将char型数据赋给unsigned int或int型变量时,若字符值最高
30、位为0,则高24位补0;若字符值最高位为1,则高24位全补1。,五、数据类型转换,例2-7,强制类型转换的一般形式为:(类型名)(表达式)【注意】:(1)表达式应该用括号括起来。,五、数据类型转换,3、强制类型转换,main()float x=5.5;int i;i=(int)x%3;printf(“%d”,i);,例如:1/2=0(float)1/2=0.500000,(2)经强制类型转换后,得到的是一个所需类型的中间变量,原来变量的类型并没有发生任何变化。,【例2-10】分析下面程序的运行结果。main()int a;float b=3.5;a=(int)b;printf(a=%d,b=%fn,a,b);,五、数据类型转换,上机练习:,P22 例2-6P24 例2-8 例2-9P25 例2-10 例2-11 例2-12,