C语言第二章ppt课件.ppt

上传人:飞****2 文档编号:82430220 上传时间:2023-03-25 格式:PPT 页数:55 大小:217.50KB
返回 下载 相关 举报
C语言第二章ppt课件.ppt_第1页
第1页 / 共55页
C语言第二章ppt课件.ppt_第2页
第2页 / 共55页
点击查看更多>>
资源描述

《C语言第二章ppt课件.ppt》由会员分享,可在线阅读,更多相关《C语言第二章ppt课件.ppt(55页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第二章 数据类型、运算符与表达式2.1 的数据类型 一个程序应包括两个方面的内容:数据的描述。操作步骤,即动作的描述。数据是操作的对象,操作的结果会改变数据的状况。打个比方,厨师做菜肴,需要有菜谱,菜谱上一般应包括:配料,指出应使用哪些原料:操作步骤,指出如何使用这些原料按规定的步骤加工成所需的菜肴,没有原料是无法加工成所需菜肴的。面对同一些原料可以加工出不同风味的菜肴。作为程序设计人员,必须认真考虑和设计数据结构和操作步骤(即算法)。因此,著名计算机科学家沃思(Niklklaus Wirth)提出一个公式:数据结构十算法=程序 实际上,一个程序除了以上两个主要要素之外,还应当采用结构化程序设

2、计方法进行程序设计,并且用某一种计算机语言表示。因此,可以这样表示。程程序序算算法法十十数数据据结结构构十十程程序序设设计计方方法法十十语语言言工工具和环境具和环境 也就是说,以上四个方面是一个程序设计人员所应具备的知识。在本书中不可能全面介绍这些内容,它们都属于有关的专门课程范畴。本书主要介绍语言本身,而下拟深入介绍有关算法和数据结构等方面的知识。语言提供的数据结构是以数据类型形式出现的,的数据类型如下:语言中数据有常量与变量常量与变量之分,它们分别属于以上这些类型。在本章中主要介绍基本数据类型。整型字符型单精度基本类型实型枚举类型双精度 数据类型数组类型构造类型结构体类型共用体类型指针类型

3、空类型2.2 常量与变量常量与变量2.2.1常量和符号常量常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量其值不能被改变的量称为常量。常量区分为不同的类型,如、等为整型常量整型常量,4.6,-1.23等为实型常量实型常量,a,d为字符常量字符常量,一般从其字面形式即可判别,也可以用一个标识符标识符代表一个常量。例/*example 2.1 on page11*/#define PI 3.1415926main()float s,r,l;r=10.;l=2.*PI*r;s=PI*r*r;printf(l=%f s=%fn,l,s);printf(PI=%fn,PI);程序中用#def

4、inedefine命令行定义PIPI代表常量3.1415926,此后凡在此文件中出现的PI都代表3.1415926,可以和常量一样进行运算.有关#definedefine命令行的详细用法参见第章。这种用一个标标识识符符代代表表一一个个常常量量的的,称称为为符符号号常常量量,即标标识识符符形形式式的的常常量量,注意符号常量不同于变量,它的值在其作用域(在本例中为主函数)内不能改变,也不能再被赋值。如再用以下赋值语句给PI赋值:PI=3.1416是错误的。习惯上,符号常量名用大写,变量用小写,以示区别2.2.2变量 其值可以改变的量称为变量其值可以改变的量称为变量。一个变量应该有一个名字名字,在内

5、存中占据一定的存储单元存储单元。在该存储单元中存放变量的值。请注意区分变量名和变量值变量名和变量值这两个不同的概念。和其它高级语言一样,用来标识变量名、符号常量名、函数名、用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列称标识符数组名、类型名、文件名的有效字符序列称标识符(identifier),identifier),简单他说,标识符就是一个名字简单他说,标识符就是一个名字。C语言规定标识符只能由字母、数字和下划线三种字符组成语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。如 sum,average,class,day,month,

6、student_name,下面是不合法的标识符和变量名:M.D,John,$123.#33,3D64,a b 注意,大写字母和小写字母被认为是两个不同的字符大写字母和小写字母被认为是两个不同的字符。因此,和是两个不同的变量名。习惯上,变量名用小写字母表示,以增加可读性。语语言言中中标标识识符符的的长长度度(字字符符个个数数)取取个个字字符符,假如程序中出现的变量名长度大于个字符,则只只有有前前面面个个字字符符有有效效,后面的不被识别。例如,有两个变量:student_name和student_number,由于二者的前个字符相同,系统认为这两个变量是一回事而不加区别。可以将它们改为:stud_

7、name和stud_num以使之区别。因此,在写程序时应了解所用系统对标识符长度的规定,以免出现上面的混淆,这种错误并不反映在编译过程中(即语法无错误),但运行结果显然不对。在选择变量名和其它标识符时,应注意做到“见见名名知知意意”,即选有含意的英文单词(或其缩写)作标识符,如count,name,day,month,class,city,country等,除了数值计算程序外,一般不要用代数符号(如a,b,c,x1,y1等)作变量名,以增加程序的可读性。这是结构化程序的一个特征。本书在一些简单的举例中,为简单起见,仍用单字符的变量名(如a,b,等),请读者注意不要在其它所有程序中都如此。在语言

8、中,要求对所有用到的变量作强制定义,也就是“先先定义,后使用定义,后使用”,否则,在编译时会指出有关“出错信息”。下面各节分别介绍整型、实型(浮点型)、字符型数据。2.3 整型数据整型数据2.3.1 整型常量整型常量 整型常量即整常数。整常数可用以下三种形式表示:十进制整数。如、一、。八进制整数。以O开头的数是八进制数。如O123表示八进制数123,即(123)8等于十进制数。-o11表示八进制数-11,即十进制数-9。十六进制整数。以开头的数是进制数。如,代表进制数,即()160=。一等于十进制数一。main()int a=0123;b=ox123;printf(“a=%d,b=%d”,a,

9、b);2.3.2 整型变量整型变量 一、整型变量的分类整型变量的分类 整型变量可分为:基基本本型型、短短整整型型、长长整整型型和和无无符符号号型型四种。基本型,以int表示。2.短整型,以short int表示,或以short表示。3.长整型,以1ong int表示,或以1ong表示。4.无符号型,存储单元中全部二进位(bit)用作存放数本身,而不包括符号。无符号型中又分为无无符符号号整整型型、无无符符号号短短整整型型和和无无符符号号长长整整型型,分别以unsigned int,unsigned short unsigned long表示。无符号型变量只能存放不带符号的整数,如123、4687

10、等,而不能存放负数,如-123、-3,一个无符号整型变量中可以存放的数的范围比一般整型变量中数的范围扩大一倍。如如果果整整型型量在内存中占量在内存中占2 2个字节个字节(16(16位位),则int型变量数的范围为:-3276832767.二、整型变量的定义二、整型变量的定义 前已提到,C C规规定定在在程程序序中中所所有有用用到到的的变变量量都都必必须须在在程程序序中中指指定定其其类类型型,即即“定定义义”,这是和BASIC、FORTRAN不同的,而和PASCAL相类似。例如:int a,b;(指定变量a,b为整型)unsigned short c,d;(指定变量c,d为无符号短整型)1ong

11、 e,f;(指定变量e,f为长整型)对变量的定义,一般是放在一个函数的开头部分(也可以放在程序中间,但作用域只限于某一分程序,这将在第七章介绍)。例2.2/*example 2.2 on page 14*/main()int a,b,c,d;*指定a,b,c,d为整型变量*unsigned u;*指定为无符号整型变量*/a=12;b=-24;u=10;c=a+u;d=b+u;printf(c=%d d=%d,c,d);运行结果为 十b+u=-14 可以看到不同种类的整型数据可以进行算术运算。在本例中是int型数据与unsigned int型数据进行相加相减运算(有关运算的规则在本章2.7中介绍

12、)。三、整型常量的类型 我们已知整型变量可分为intint、shortshort intint、1ong1ong intint和和unsignedunsigned intint、unsigned unsigned shortshort、unsignedunsigned long等类别。那么常量是否也有这些类别?在将一个整型常量赋值给上述几种类别的整型变量时如何做到类型匹配?请注意以下几点:1.一个整常量,如果其值在一32768+32767范围内。认为它是int型,它可以赋值给int型和1ong int型变量。一个整常量,如果其值超过了上述范围,而在一21474836482147483647范围

13、内,则认为它是1ong int型。可以将它赋值给一个1ong int型变量。如果某一计算机系统的版本确定的short int 与int型数据在内存中占据的长度相同,则它的表数范围与int型相同,因此一个int型的常量也同时是一个short int型常量,可人赋给int型或short int型变量。4.常量中无unsigned型。但一个非负值的整常量可以赋值给unsigned型整变量,只要它的范围不超过变量的表数范围即可,例如,将50000赋给一个unsigned int型变量是可以的,而将70000赋给它是不行的(溢出)。5.在一个整常量后面加一个字母l或L则认为是1ong int型常量。例如

14、123l、432L.这往往用于函数调用中。如果函数的形参为1ong Jnt型,则要求实参也为1ong int型,此时用123作实参不行,而要用123L作实参。2.4 实型数据实型数据2.4.1 实型常量实型常量 实数在语言中又称俘点数实数在语言中又称俘点数,实数有两种表示形式:1.十十进进制制数数形形式式。它由数字和小数点组成(注意必须有小数点)。0.123、.123、123.0、123.、0.0都是十进制数形式。2.指指数数形形式式,如123e3或123E3都代表123X103但注意字母e(或E)之前必须有数字。且e后面指数必须为整数,如e3、2.1e3.5、e等都不是合法的指数形式。2.4

15、.2实型变量实型变量 C实型变量分为单单精精度度(floatfloat型型)和和双双精精度度(doubledouble型型)两类,对每一个实型变量都应在使用前加以定义。如:float x,y;(指定x,y为单精度实数)doublez;(指定z为双精度实数)在在一一般般系系统统中中,一一个个floatfloat型型数数据据在在内内存存中中占占4 4个个字字节节(32(32位位)一一个个doubledouble型型数数据据占占8 8个个字字节节。单单精精度度实实数数提提供供7 7位位有有效效数数字字,双双精精度度实实数数提提供供1616位位有有效效数数字字,数数值值的的范范围围随随机机器器系系统统

16、而而异异。在在1 1BM-PC BM-PC Ms-CMs-C中中,单精度实数的数值范围约为单精度实数的数值范围约为1010-38-3810103838,双精度实数范围约为双精度实数范围约为1010-308-3081010308308。应当说明,实型常量不分float型和double型。一个实型常量可以赋给一个float型或double型变量。根据变量的类型截取实型常量中相应的有效位数字,假如a已指定为单精度实型变量:float a;a=1111.111;由于float型变量只能接收位有效数字,因此最后两位小数不起作用。如果改为double型,则能全部接收上述位数字并存储在变量中。2.5 字符型

17、数据字符型数据2.5.1字符常量字符常量 C C的的字字符符常常量量是是用用单单引引号号(即即撇撇号号)括括起起来来的的一一个个字字符符,如a,x,D,?,$等都是字符常量,注意,a和A是不同的字符常量。除了以上形式的字符常量外,C还允许用一一种种特特殊殊形形式式的的字字符符常常量量,就是以一一个个”开开头头的字符序列,例如,前面已经遇到过的,在printf函数中的n,它代表一个“换行”符。这种非非显显示示字字符符难以用一般形式的字符表示,故规定用这种特殊形式表示。常用的以以“”开头的特殊字符开头的特殊字符见表表中列出的字符称为“转转义义字字符符”,意思是将反斜杠()后面的字符转转变成变成另外

18、的意义。如“n”中的“n”不代表字母n而作为“换行”符。表中最后第二行是用ASCII码(八进制数)表示的一个字符,例如101代表字符A。012代表“换行”。用376,代表图形字符。用表中的方法可以表示任何可输出的字母字符、专用字符、图形字符和控制字符。请注意0或000是代表ASCII码为0的控制字符,即“空操作”字符。它将用在字符串中。例2.3 main ()printf(“ab ct derftgn”);printf(htibbj k);程序运行时在打印机打印机上得到以下结果:f ab c gdeh ji k 注意在显示屏上最后看到的结果与上述打印结果不同,是:f gdeh j k2.5.2

19、 字符变量字符变量 字字符符型型变变量量用用来来存存放放字字符符常常量量,注注意意只只能能放放一一个个字字符符,不不要要以以为为在一个字符变量中可以放一个字符串在一个字符变量中可以放一个字符串(包括若干字符包括若干字符)。字符变量的定义形式如下字符变量的定义形式如下:char c1,c2;它表示c1和c2为字符型变量,各可以放一个字符,因此可以用下面语句对c1、c2赋值:c1=a;c2=b;一般以一个字节来存放一个字符,或者说一个字符变量在内存中占一个字节。253 字字符符数数据据在在内内容容中中的的存存储储形形式式及及其其使使用方法用方法将一个字符常量放到一个字符变量中,实际上并不是把该字符

20、本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单元中。例如字符a的ASCII代码为97,b为98,在内存中变量c1、c2的值如图2.2(a)所示。实际上是以二进制形式存放的,如图2.2(b)所示。c1 c2 97 98 01100001 01100010 【例2.4】main()char c1,c2;c1=97;c2=98;printf(%c%c,c1,c2);c1、c2被指定为字符变量。但在第3行中,将整数97和98分别赋给c1和c2,它的作用相当于以下两个赋值语句:c1=a;c2=b因为a和b的ASCII码为97和98。也可以理解为将97和98两个整数直接存放到cl和c2

21、的内存单元中。而c1=a和c2=b是先将字符a和b成ASCII码头97和98,然后放到内存单元中。二者作用是相同的。第4行将输出两个字符。“%c”是输出字符的格式符。程序输出:a b既然在内存中,字符数据以ASCII码存储,它的存储形式与整数的存储形式相类似。C语言使字符型数据和整型数据之间可以通用。一个字符数据既可以以字符形式输出,也可以以整数形式输出。以字符形式输出时,需要先将存储单元中的ASCII码转换成相应字符,然后输出。以整数形式输出时,直接将ASCII码作为整数输出。也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算。【例2.4】main()char c1,c

22、2;c1=a;c2=b;c1=97;c2=98;printf(%c%c,c1,c2);c1、c2被指定为字符变量。但在第3行中,将整数97和98分别赋给c1和c2,它的作用相当于以下两个赋值语句:c1=a;c2=b因为a和b的ASCII码为97和98。也可以理解为将97和98两个整数直接存放到cl和c2的内存单元中。而c1=a和c2=b是先将字符a和b成ASCII码头97和98,然后放到内存单元中。二者作用是相同的。第4行将输出两个字符。“%c”是输出字符的格式符。程序输出:A B 字符数据与整型数据可以互相赋值。如:int i;char c;i=a;c=97;是合法的。如果将i的值输出得到9

23、7。输出c可得字符a。字符数据可以以字符形式输出,也可以用整数形式输出。例如在上面语句之后执行语句:printf(”c,dn”,c,c);printf (”c,dn”,i,i);输出:a,97 a,972.5.4 字符串常量字符串常量 前面已提到,字字符符常常量量是由一对单单引引号号括括起起来来的的单单个个字字符符。C语言除了允许使用字符常量外,还允许使用字字符符串串常常量量。字符串常量是一对双引号括起来的字符序列双引号括起来的字符序列。如:“How do you do。”,”CHINA”,”12345”都是字符串常量,可以输出一个字符串,如 printf (”How do you do.”)

24、:不要将字符常量与字符串常量混淆。a是字符常量,”a”是字符串常量,二者不同。假设 c被指定为字符变量:char c;c=a;是正确的。而 c=”a”;是错误的。c”CHINA”,也是错误的。不能把一个字符串赋给一个字符变量。有人不能理解:a和“a”究竟有什么区别。C规定:在每一个字符串的结尾加一个“字字符符串串结结束束标标志志”,以便系统据此判断字符串是否结束。c规定以字符0作为字符串结束标志。0是一个ASCII码为0的字符,从ASCII代码表中可以看到ASCII码为0的字符是,“空操作字符”,即它不引起任何控制动作,也不是一个可显示的字符。如果有一个字符串,“CHINA”实际上在内存中是

25、C H I N A0它的长度不是5个字符,而是6个字符,最后一个字符为0。但在输出时不输出0。例如在printf(”How do you do。”)中,输出时一个一个字符输出,直到遇到最后的0字符,就知道字符串结束,停止输出。注意,在写字符串时不必加0,否则画蛇添足,0,字符是系统自动加上的。字符串”a”,实际上包含2个字符:a和0,因此,把它赋给一个字符变量c:c”a”显然是不行的 在C语言中没有专门的字字符符串串变变量量(BASIC中的字符串变量形式为A、B等),字符串如果需要存放在变量中,需要用字字符符数数组组来存放,即用一个字符型数组来存放一个字符串,这将在第六章中介绍。26变量赋初值

26、变量赋初值 程序中常需要对一些变量预预先先设设置置初初值值。C规定,可以在定义变量时同时使变量初始化。如:int a=3;指定a为整型变量,初值为3 float f=3.56;指定f为实型变量,初值为356 char c=a;指定c为字符变量,初值为a 也可以使被定义的变量的一部分赋初值。如:int a,b,c=5表示a、b、c为整型变量,只有c初始化,值为5。如果对几个变量赋以同一个初值,不能写成:jnt abc=3;而应写成:int a3,b3,c=3;初始化不是在编译阶段完成的(只有在第六章中介绍的静态存储变量和外部变量的初始化是在编译阶段完成的),而是在程序运行时执行本函数时赋以初值的

27、。相当于有一个赋值语句,例如 int a=3;相当于:int a;指定a为整型变量 a=3;赋值语句,将3赋予a又如 int a,b,c=5;相当于:int a,b,c;指定a、b、c为整型变量 c5;将5赋给c作业:2.3 2.4 2.6 2.727各类数值型数据间的混合运算各类数值型数据间的混合运算 整整型型、单单精精度度型型、双双精精度度型型数数据据可可以以混混合合运运算算。前已述及,字符型数据可以与整型通用,因此,整型、实型(包括单、双精度)、字符型数据间可以混合运算。例如 10+a+15-87651234b是合法的。在进行运算时,不不同同类类型型的的数数据据要要先先转转换换成同一类型

28、成同一类型,然后进行运算。转换的规则按图2.3所示 图中横横向向向向左左的的箭箭头头表表示示必必定定的的转转换换,如字符数据必定先转换为整数,short型转为int型,float型数据在运算时一律转换成双精度型,以提高运算精度(即使是两个float型数据在加化成double型,然后再相加)。纵纵向向的的箭箭头头表表示示当当运运算算对对象象为为不不同同类类型型时时转转换换的的方方向向。例如int型与doub1e型数据进行运算,先将int型的数据转换成图double型,然后在两个同类型(double型)数据进行运算,结果为double型。注意箭头方向只表示数据类型级别的高低,由低向高转换,不要理解

29、为int型先转成unsigned型,再转成1ong型,再转成double型。如果一个Int型数据与一个double型数据运算,是直接将int型转成double型。同理,一个int型与一个Long型数据运算,先将int型转换成1ong型。double floatlongunsignedint char,short 换言之,如果有一个数据是float型或double型,则另一数据要先转为double型,结果为double型。如果二个数据中最高级别为1ong型,则另一数据先转为1ong型,结果为1ong型。其它依此类推。假设已指定i为整型变量,f为float变量,d为double型变量,e为1ong

30、型,有下面式子:10十ai*f-d/e运算次序为:进行10a的运算,先将a转换成整数97,运算结果为107。进行i*f的运算。先将i与f都转成double型,运算结果为dOuble型。整数107与i*f的积相加。先将整数107转换成双精度数(小数点后加若干个0,即10700000),结果为double型。将变量e化成double型,d/e结果为double型。将10十ai*f的结果与”d/e结果为double型。上述的类型转换是由系统自动进行的。2.8算术运算符和算术表达式算术运算符和算术表达式2.8.1 C运算符简介运算符简介 c语言的运算符范围很宽,把除了控控制制语语句句和输输入入输输出出

31、以外的几乎所有的基本操作都作为运运算算符符处理,例如将赋值符“=”作为赋赋值值运运算算符符,方方括括号号作作为为下下标标运算符运算符等。C的运算符有以下几类。1算术运算符 (见282节)2关系运算符 (=!=)3逻辑运算符 (!|)4位运算符 (|&)5赋值运算符 (=及其扩展赋值运算符)6条件运算符 (?:)7。逗号运算符 (,)8指针运算符 (*和&)9求字节数运算符 (sizeof)10强制类型转换运算符 (类型)11分量运算符 ()12下标运算符 ()13其它 (如函数调用运算符()在本章只介绍算术运算符和赋值运算符算术运算符和赋值运算符,在以后各章中结合有关内容将陆续介绍其它运算符。

32、运算符见本章附录。2.8.2 算术运算符和算术表达式算术运算符和算术表达式 一、基本的算术运算符一、基本的算术运算符 十(加法运算符,或正值运算符。如35、3)一(减法运算符,或负值运算符,如5一2、一3)*(乘法运算符。如3*5)(除法运算符。如53)(模运算符,或称求余运算符,要求两侧均为整型数据,如74的值为3)。需要说明,两两个个整整数数相相除除结结果果为为整整数数,如如5/3的的结结果果值值为为1,舍舍去去小小数数部部分分。但是如果除数或被除数中有一个为负值,则舍入的方向是不固定的。例如,一53在有的机器上得到结果-1,有的机器则给出结果一2。多多数数机机器器采采取取“向向零零取取整

33、整”方方法法,即5/31,一53=-1,取取整整后后向向零零靠靠拢拢。如果参加运算的两个数中有一个数为实数,则结果是double型,因为所有实数都按double型进行运算。二、算术表达式和运算符的优先级与结合性二、算术表达式和运算符的优先级与结合性 用算术运算符和括号将运运算算对对象象(也也称称操操作作数数)连接起来的、符合C语法规则的式子,称称C C算算术术表表达达式式。运算对象包括常量、变量、函数等。例如,下面是一个合法的C算术表达 a*bc一15十a C语言规定了运算符的优优先先级级和结结合合性性,在表达式求值时,先按运运算算符符的的优优先先级级别别高高低低次次序序执执行行,例如先乘除后

34、加减。如a-b*ca-b*c,b的左侧为减号,右侧为乘号,而乘号优先于减号,因此,相当于:a-(b*c)。如果在一个运算对象两侧的运算符的优先级别相同,如:a-bc,则按规定的“结结合合方方向向”处理。C规定了各种运运算算符符的的结结合合方方向向(结结合合性性),算算术术运运算算符符的的结结合合方方向向为“自自左左至至右右”,即即先先左左后后右右,因此b先与减号结合,执行a一b的运算,再执行加c的运算。“自自左左至至右右的的结结合合方方向向”又又称称“左左结结合合性性”,即运算对象先与左面的运算符结合。以后可以看到有些运算符的结合方向为“自自右右至至左左”,即即右右结结合合性性(例例如如,赋赋

35、值值运运算算符符)。关关于于“结结合合性性”的的概概念念在在其其它它一一些些高高级级语语言言中中是是没没有有的的,是C的特点之一,希望能弄清楚。附录列出了所有运算符以及它们的优先级别和结合性。如果一个运算符的两侧的数据类型不同,则会按2.7所述,先自动进行类型转换,使二者具有同一种类型,然后进行运算。三三、可可以以利利用用强强制制类类型型转转换换运运算算符符将将一一个个表表达达式式转转换换成成所所需需类类型型。例如:例如:(double)a (将a转换成double类型)(int)(x+y)(将调x+y的值转换成整型)(float)(53)(将53的值转换成float型)其一般形式为其一般形式

36、为 (类型名)(表达式)(类型名)(表达式)注意,表达式应该用括号括起来。如果写成 (int)x+y则只将x转换成整型,然后与y相加。需要说明的是在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。例如 (int)x (不要写成int (x)如果x原指定为float型,进行强制类型运算后得到一个int型的中间变量,它的值等于x的整数部分,而x的类型不变(仍为float型,)见下例:main ()float x;x=3.6;i=(int)x;printf(“xf,i=d”x,i);运行结果如下:x=3.600000,i=3 x类型仍为float型,值仍等于36。从上可知:有两

37、种类型转换,一种是在运算时不必用户指定,系统自动进行类型转换,如3+6.5。第二种是强制类型转换,当自动类型转换不能实现目的时,可以用强制类型转换。如“”运算符要求其两侧均为整型量,若x为float型,则“x3”不合法,必须用:(int)x3”。从附录可以查到,强制类型转换运算优先于运算,因此先进行(int)x的运算,得到一个整型的中间变量,然后再对3求模。此外,在函数调用时,有时为了使实参与形参类型一致,可以用强制类型转换运算符得到一个所需类型的参数。四、自增、自减运算符四、自增、自减运算符 作用是使变量的值增值增1 1或减或减1 1,如:i,-i (在使用i之前,先使i的值加(减)1)i,

38、i-(在使用i之后,使i的值加(减)l)粗略地看,i和i十十的作用相当于ii+1。但十十i和i十十不同之处在于十十i是先执行i=i+1后,再使用i的值;而i十十是先使用i的值后,再执行i=i+1。如果i的原值等于3,则:ji;j的值为4 j=i十十;j的值为3,然后i变为4又如:i=3;printf (”d”,十十i);输出“4”。若改为 printf(”d”,i十十);则输出“3”。注意:(1)自增运算符(),自减运算符(-),只能用于变量,而不能用于常量或表达式,如5或(ab)都是不合法的。因为5是常量,常量的值不能改变。(ab)也不可能实现,假如a十b的值为5,那么自增后得到的6放在什么

39、地方呢?无变量可供存放。(2)十十和-的结合方向是“自右至左自右至左”。见附录。前面已提到,算术运算符的结合方向为“自左而右自左而右”,这是大家所熟知的。如果有-i,i的左面是负号运算符,右面是自加运算符。如果i的原值等于3,若按左结合性按左结合性,相当于(-i)十十,而(-i)是不合法的。对表达式不能进行自加自减运算。从附录可知负号运算符和“”运算符同优先级,而结合方向为“自右至左自右至左”(右结合性),即它相当于-(i),如果有printf(”d”,-i),则先取出i的值使用,输出-i的值-3,然后使i增值为4。注意(i)是先用i的原值进行运算以后,再对i加1,不要认为先加完1后再加负号,

40、输出-4,这是不对的。自增(减)运算符常用于循环语句中使循环变量自动加1。也用于指针变量,使指针指向下一个地址。这些将在以后的章节中介绍五、有关表达式使用中的问题说明五、有关表达式使用中的问题说明 C运算符和表达式使用灵活,利用这一点可以巧妙地处理许多在其它语言中难以处理的问题。但另一方面,有时会出现一些令人容易搞混的问题,因此务必要小心谨慎。1在表达式中包含自加或自减运算时,很容易出错在表达式中包含自加或自减运算时,很容易出错。i或i一一什么时候进行自加或自减呢?如果有以下赋值语句,若i原值等于3,ki;显然先将i的原值赋给以k(k的值等于3),然后i进行自加,执行完此语句后,i的值等于4。

41、如果有以下表达式:(i十十)十(i十十)十(i十十)表达式的值是多少呢?有人认为相当于345,即12。事实上用TurboC和MS C系统时它等于9。即先把i的原值(3)取出来,作为表达式中i的值;因此先进行三个i相加,得9。然后再实现自加,i的值变为6。而 k(十十i)十(十十i)十(十十i)有人以为从左到右使i增值,相当于k=456,得15。事实上k=18。原因是:i的自加是在整个表达式求解一开始时最先进行的,即对表达式扫描,先对i进行三次自加,i得6,然后进行k=666的运算,故得18。2C语言中有的运算符为一个字符,有的运算符由两个字符组成,在表达式中如何组合呢?如ij,是理解为(i)j

42、呢?还是i+(+j)?C编译在处理时尽可能多地(自左而右)将若干个字符组成一个运算符(在处理标识符、关键字时也按同一原则处理),如ij,将解释为(i)j,而不是i+(j)。3C语言中类似上述这样的问题还有一些。例如,在调用函数时,实参数的求值顺序,C标准并无统一规定。如i的初值为3如果有下面的函数调用:printf (“d,d”,i,i)在有的系统中,从左至右从左至右求值,输出“3,3”。在多数系统中对函对函数参数的求值顺序数参数的求值顺序是自右而左自右而左,上面printf函数中要输出两个表达式的值(i和i分别是两个表达式),先计算出i的值再计算i的值,输出i十十,是先输出i的值3然后使i加

43、1变为4,这个4就成了printf函数中第一个参数i的值,因此上面printf函数输出的是“4,3”。这些问题不必死记,不同系统的处理方法也不相同,必要时上机试一下即可。但应当知道使用C语言时可能出问题的地方,以免遇到问题时不知其所以然。使用十十和一一时会出现一些人们“想不到”的副作用,初学者要慎用。2.9赋值运算符和赋值表达式赋值运算符和赋值表达式 一、赋赋值值符符号号“”就就是是赋赋值值运运算算符符,它的作用是将一个数据赋给一个变量。如“a3”的作用是执行一次赋值操作(或称赋值运算)。把常量3赋给变量a,也可以将一个表达式的值赋给一个变量。二、如果赋值运算符两侧的类型不一致,但都是数值型或

44、字符型时,在赋值时要进行类型转换。1将实型数据(包括单、双精度)赋给整型变量时,舍舍弃弃实实数数的的小小数数部部分分。如i为整型变量,执行“i=356”的结果是使i的值为3。2将整型数据赋给单、双精度变量时,数值下变,但以浮点数形式存储到变量中,如将23赋给float变量f,即f=23,先将23转换成2300000,再存储在f中。如将23赋给double型变量d,即d23,则将23补足有效位数字为2300000000000000,然后以双精度浮点数形式存储到d中。3字符型数据赋给整型变量时,由于字符只占一个字节,而整型变量为2个字节,因此将字符数据(8位)放到整型变量低8位中。有两种情况:(1

45、)如果所用系统将字符处理为无符号的量或对unsigned char型变量赋值,则将字符的8位放到整型变量低位,高8位补零。例如:将字符376赋给int型变量i,如图24(a)所示 (2)如果所用系统将字符处理为带符号的量,若字符最高位为0则整型变量高8位补0;若字符最高位为1则高8位全补1(图24(b)。这称为“符号扩展”这样做的目的是使数值保持不变,如变量c(字符、376)以整数形式输出为一2,i的值也是一2。C=376 11111110 111111100000000011111110 11111111111111104.将带符号的整型数据(int型)赋给1ong int型变量时。要进行符

46、号扩展,如果int型数据为正值(符号位为0)则1ong、int型变量的高16位补0;如int型变量为负值(符号位为1),则1ong型变量的高16位补1,将整型数的16位送到1ong型低16位中,以保持数值不改变。反之,若将一个1ong int型数据赋给一个int型变量,只将1ong int型数据中低16位原封不动送到整型变量(即截断),例如:int a;long int b=8;a=b;赋值情况见图25。如果b=65536(八 进 制 数 0200000),则 赋 值 后 a值 为 0。如 果 b=020000000000(八进制数),赋值后a也为0。请读者自己分析。2109876543210

47、987 6543210987654321 int a;0000000000000000 0000000000001000 long int b=8;0000000000001000a=b;b=65536(216)0000000000000001 0000000000000000 0000000000000000 5 将unsigned int 型数据赋给long int,不存在扩展问题,只需将高位补即可。将一个unsigned int 型数据赋给一个占字节数相同的整型变量(例如unsigned intint,unsigned longlong,unsigned short short)将uns

48、igned型变量的内容原样送到非unsigned型变量中,但如果数据范围超过相应整型的范围,则会出现数据错误。如:unsigned int a=65535(216-1);int b;b=a;unsigned a 1111111111111111 int b 1111111111111111 将a整个送到b中,由于b是int型,第1位是符号位,成了负数。(-1的补码).可以用 printf(“%d”,b);来验证一下6将非unsigned型数据赋给长度相同的unsigned型变量,也是原样照赋(连原有的符号位也作为数值一起传送)。如:main ()unsigned a;int b=-1;a=b;

49、printf(”u”,a);运行结果 65535unsigned a 1111111111111111 int b 1111111111111111赋值情况见图27。如果b为正值,且在032767之间,则赋值后数值不变。三、复合的赋值运算符三、复合的赋值运算符 在赋值符“=”之前加上其它运算符,可以构成复合的运算符。如果在“=”前加一个“十”运算符就成了复合运算符“十=”。例如,可以有:a+=3 等价于 a=a3 x*y+8 等价于 x=x*(y+8)x=3 等价于 x=x3以“a+=3”为例来说明,它相当于使a进行一次自加(3)的操作。即先使a加3,再赋给a。同样,“x*y8”的作用是使x乘

50、以(y8),再赋给x。为便于记忆,可以这样理解:a十b (其中a为变量,b为表达式)a十=b (将有下划线的“a十”移到“=”右侧)a=a+b (在“=”左侧补上变量名)注意,a=a+b 如果b是包含若干项的表达式,则相当于它有括号。如:x=y3 x=(y3)x=x%(y3)(不要写成x=xy3)凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符。C语言规定可以使用10种复合赋值运算符。即:+=,-=,*=,/=,%=,=,=,=,|=后5种是有关位运算的,将在第十一章介绍。C采用这种复合运算符,一是为了简化程序,使程序精练,二是为了提高编译效率(这样写法与“逆波兰”式一致,有利于编译

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁