第2章 C程序设计的初步知识.doc

上传人:精*** 文档编号:1156281 上传时间:2024-11-23 格式:DOC 页数:11 大小:120.50KB
下载 相关 举报
第2章 C程序设计的初步知识.doc_第1页
第1页 / 共11页
第2章 C程序设计的初步知识.doc_第2页
第2页 / 共11页
第2章 C程序设计的初步知识.doc_第3页
第3页 / 共11页
第2章 C程序设计的初步知识.doc_第4页
第4页 / 共11页
第2章 C程序设计的初步知识.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、第2章 C程序设计的初步知识C语言语法简洁、紧凑,使用方便、灵活,具有丰富的预定义运算符和数据类型,自定义数据类型也十分灵活。C程序的模块化主要通过函数实现。由于C语言既有高级语言的功能,又有低级语言的一些功能,因此既可以用它来编写系统软件,也可以用来编写应用软件。2.1 简单C语言程序的构成和格式为了了解C语言程序的构成和编写格式,下面先看一个简单的C程序例子。例2.1 求矩形的面积。程序如下:#includemain( )double x,y, area;x = 1.2; /*将矩形的两条边长分别赋给a和b*/y = 3.6;area = x* y; /*计算矩形的面积并存储到变址area

2、中*/printf(x = %f, y = %f, area = %fn,x,y,area); /*输出矩形的两条边长和面积*/ 执行以上程序后的输出结果如下:a = 1.200000,b = 3.600000,area = 4.320000以上程序中,main是主函数名,C语言规定必须用main作为主函数名。其后的一对圆括号中间可以是空的,但这一对圆括号不能省略。程序中的main()是主函数的起始行,也是C程序执行的起始行。每一个可执行的C程序都必须有一个且只能有一个主函数。一个C程序中可以包含任意多个不同名的函数,但只能有一个主函数。一个C程序总是从主函数开始执行。在函数的起始行后面用一对

3、花括号“”括起来的部分为函数体。函数体内通常有定义(说明)部分和执行语句部分。以上程序中的“double a, b, area;”为程序的定义部分;从“a = 1.2;”到“printf(a = %f, b = %f, area = %f/n, a, b, area);”是程序的执行部分。执行部分的语句称为可执行语句,必须放在定义部分之后,语句的数量不限,程序中由这些语句向计算机系统发出操作指令。定义语句用分号“;”结束。在以上程序中只有一个定义语句。该语句对程序中所用到的变量a,b,area进行定义,说明它们为double类型的变量。程序中“a=1.2;”和“b=3.6;”的作用是分别给矩形

4、的两条边赋值,“area=a * b;”的作用是计算出矩形面积并赋给变量area, “printf(a = %f, b = %f, area = %fn ,a, b, area);”的作用是按格式把a、b和area的值输出到屏幕。C程序中的每一条执行语句都必须用分号“;”结束,分号是C语句的一部分,不是语句之间的分隔符。C语言程序有比较自由的书写格式,但是过于“自由”的程序书写格式往往使人们很难读懂程序,初学者应该从一开始就养成良好的习惯,使编写的程序便于阅读。在编写程序时可以在程序中加入注释,以说明变量的含义、语句的作用和程序段的功能,从而帮助人们阅读和理解程序。因此,一个好的程序应该有详细

5、的注释。在添加注释时,注释内容必须放在符号“/*”和“*/之间。“/*”和“*/”必须成对出现,“/”与“*”之间不可以有空格。注释可以用英文,也可以用中文,可以出现在程序中任意合适的地方。注释部分只是用于阅读,对程序的运行不起作用。按语法规定,在注释之间不可以再嵌套“/*”和“*/”,如:/*/*/*/这种形式是非法的。注意:注释从“/*”开始到最近的一个“*/”结束,其间的任何内容都被编译程序忽略。程序中的“#include ”通常称为命令行,命令行必须用“#”号开头,行尾不能加“;”号,它不是C程序中的语句。一对括号“”之间的stdio.h是系统提供的头文件,该文件中包含着有关输入输出函

6、数的说明信息。在程序中调用不同的标准库函数,应当包含相应的文件,以使程序含有所调用标准库函数的说明信息。至于应该调用哪个文件,将在以后的章节中陆续介绍。2.2 标识符、常量和变量2.2.1 标识符在C语言中,有许多符号的命名,如变量名、函数名、数组名等,都必须遵守一定的规则,按此规则命名的符号称为标识符。合法标识符的命名规则是:标识符可以由字母、数字和下划线组成,并且第一个字符必须为字母或下划线。在C语言程序中,凡是要求标识符的地方都必须按此规则命名。以下都是合法的标识符:area、PI、_ini、a_array、a1234、P101p以下都是非法的标识符:456P、cade-y、w.w、a&

7、b在C语言的标识符中,大写字母和小写字母被认为是两个不同的字符,例如page和Page是两个不同的标识符。对于标识符的长度(即一个标识符允许的字符个数),C语言编译系统是有规定的,即标识符的前若干个字符有效,超过的字符将不被识别。不同的C语言编译系统所规定的标识符有效长度可能会不同。有些系统允许取较长的名字,读者在取名时应当了解所用系统的具体规定。C语言的标识符可以分为以下三类。一、关键字C语言已经预先规定了一批标识符,它们在程序中都代表着固定的含义,不能另作他用,这些标识符称为关键字。例如,用来说明变量类型的标识符int,double以及if语句中的else等都已有专门的用途,它们不能再用作

8、变量名或函数名。二、预定义标识符所谓预定义标识符是指在C语言中预先定好并具有特定含义的标识符,如C语言提供的库函数的名字(如printf)和预编译处理命令(如define)等。C语言允许把这类标识符重新定义另作他用,但这将使这些标识符失去预先定义的原意。鉴于目前各种计算机系统的C语言都一致把这类标识符作为固定的库函数名或预编译处理中的专门命令使用,因此为了避免误解,建议用户不要把这些预定义标识符另作他用。三、用户标识符由用户根据需要定义的标识将称为用户标识符,又称自定义标识符。用户标识符一般用来给变量、函数、数组等命名。程序中使用的用户标识符除要遵守标识符命名规则外,还应注意做到“见名知义”。

9、即选择具有一定含义的英文单词或汉语拼音作为标识符,如numberl、red、yellow、green、work,等,以增加程序的可读性。如果用户标识符与关键字相同,则在对程序进行编译时系统将给出出错信息;如果用户标识符与预定义标识符相同,系统并不报错,只是该预定义标识符将失去原定含义,代之以用户确认的含义,这样有可能会引发一些运行时错误。2.2.2 常量所谓常量是指在程序运行过程中,其值不能被改变的量。在C语言中,有整型常量、实型常量、字符常量和字符串常量等类型。整型常量还可以进一步分为短整型常量、长整型常量等。整型常量和实型常量又称数值型常量,它们有正值和负值的区分。基本整型常量只用数字表示

10、,不带小数点,例如12、-1、0等。实型常量必须用带小数点的数表示,例如3.14159、-2.71828、0.0等。A和d则是字符型常量,而NCRE和Beijing是字符串常量。由此可见,常量的类型从字面形式上是可区分的,C编译程序就是以此来确定常量类型的。2.2.3 符号常量在C语言程序中,可以用一个符号名来代表一个常量,称为符号常量。这个符号名必须在程序中进行特别的“指定”,并符合标识符的命名规则。例2.2 计算圆面积。#includestdio.h#define PI 3.14159 /*定义符号名PI为3.14159/main( )double r,s;r=5.0;s=PI*r*r;p

11、rintf(s=%fn,s);执行以上程序后的输出结果如下:s=78.539750程序中用#define命令行(注意:不是语句)定义PI代表一串字符3.14159,在对程序进行编译时,凡本程序中出现PI的地方,编译程序均用3.14159来替换。为了使之比较醒目,这种符号名通常采用大写字母表示。用define进行定义时,必须用“#”作为一行的开头,在#define命令行的最后不得加分号。有关#define命令行的作用,将在后续篇章中介绍。2.2.4 变量所谓变量是指在程序运行过程中其值可以改变的量。程序中用到的所有变量都必须有一个名字作为标识,变量的名字由用户定义,它必须符合标识符的命名规则,如

12、例2.1中的a、b和area就是由用户定义的变量名。一个变量实质上是代表了内存中的某个存储单元。在程序中。变量a就是指用a命名的某个存储单元,用户对变量a进行的操作就是对该存储单元进行的操作;给变量a赋值,实质上就是把数据存入该变量所代表的存储单元中。C语言规定,程序中所有变量都必须先定义后使用。对变量的定义通常放在函数体内的前部,但也可以放在函数的外部或复合语句的开头。像常量一样,变量也有整型变量、实型变量、字符型变量等不同类型。在定义变量的同时要说明其类型,系统在编译时就能根据其类型为其分配相应的存储单元。2.3 整型数据2.3.1 整型常量在C语言程序中,整型常量可以用十进制、八进制和十

13、六进制等形式表示。十进制基本常量用一串连续的数字表示,例如32767、-32768、0等。二八进制数也是用一串连续的数字表示,但其开头必须是数字“0”。例如010、011、016等都是合法的八进制数,与之对应的十进制数为8、9、14。因此,在C程序中不能在一个十进制数前随意添加数字“0”。例如,不能把十进制数11写成011。注意:八进制数必须用合法的八进制数字表示。例如,不能写成O18,因为数字8不是八进制数字。十六进制数用数字0和字母x(或大写字母X)开头。例如0x10,0Xde,0xf等都是合法的十六进制数,与之对应的十进制数分别为16、222、15。注意:十六进制数必须用合法的十六进制数

14、字表示。十六进制数中的字a,b,c,d,e,f既可以用小写也可以用大写。在C程序中,只有十进制数可以是负数,而八进制和十六进制数只能是整数。整型常量又有短整型(short int)、基本整型(int)、长整型(long int)和无符号型(unsigned)等不同类型。2.3.2 整型变量整型变量可以分为基本型、短整型、长整型和无符号型四种。本节只介绍基本型的整型变量。基本型的整型变量用类型名关键字int进行定义,例如:int k;/*定义k为整型变量*/一个定义语句必须以一个“;”号结束。在一个定义语句中也可以同时定义多个变量,变量之间用逗号隔开。例如:int i,j,k; /*定义i,j,

15、k为整型变量*/不同的编译系统为int变量开辟的内存单元大小不同。VC6.0为int变量开辟4个字节(32个二进制位)的内存单元,并按整型数的存储方式存放数据,允许存放的数值范围是:-21474836x82147483547整型的变量只能存放整型数值。当按上述方式定义变量i、j和k时,编译程序仅为i、j和k开辟存储单元,而没有在存储单元中存放任何初值,此时变址中的值是无意义的,称变量值“无定义”。C语言规定,可以在定义变量的同时给变量赋初值,也称变量初始化。例如:main() int i=1,j=0,k=2; /*定义i,j,k为整型变量,它们的初值分别为1、0和2*/2.3.3 整型数据的分

16、类前面介绍的int类型通常称为基本整型。除此之外,C语言中整型数据还有其他三种类型:短整型(short int)、长整型(int或long int)、无符号型(unsigned)。若不指定变量为无符号型,则变量隐含为有符号型(signed)。不同的编译系统或计算机系统对这几类整型数所占用的字节数有不同的规定。表2.1列出了在VC6.0中定义的整型数所占用的字节数和数值范围。表中方括号内的单词可以省略,各单词排列的先后次序无关紧要。在VC6.0中可以在整型常量的后面加一个字母l(L的小写)或L,例如:123L、345l、0L、123456L等,这些常量在内存中占四个字节。无论是短整型数还是长整型

17、数,都被识别为有符号整数。无符号整数在数的末尾应该加上字母后缀u或U。若是长整型无符号整型常量,则可以加后缀lu或LU。短整型无符号常量的取值应在0-65535范围内,长整型无符号常量的取值在0-4294967295的范围内。注意:无符号常量不能表示成小于0的负数,例如:-200U是不合法的。2.3.4 整数在内存中的存储形式计算机中,内存储器的最小存储单位称为“位(bit)”。由于只能存放0或1,因此称为二进制位。大多数计算机把8个二进制位组成一个“字节(byte)”,并给每个字节分配一个地址。若干字节组成一个“字(word)”,用一个“字”来存放一条机器指令或一个数据。一个字含多少个字节随

18、机器的不同而不同。如果一台计算机以两个字节(16个二进制位)来存放一条机器指令,则称此计算机的字长为16位;如果以四个字节(32个二进制位)来存放一条机器指令,则称此计算机的字长为32位。通常把一个字节中的最右边一位称为最低位,最左边一位称为最高位。对于一个有符号整数,其中最高位(最左边的一位)用来存放整数的符号,称为符号位。若是正整数,最高位放置0;若是负整数,最高位放置1。一、正整数当用两个字节存放一个short类型正整数时,例如正整数5,其在内存中的二进制码为:0000000000000101对于正整数的这种存储形式称为用“原码”形式存放。因此用两个字节存放short类型的最大正整数是:

19、0111111111111111它的值为32767。为简单起见,若一个字节能够正确表示一个整数时,本书则用一个字节表示。二、负整数1.负整数在内存中是以“补码”形式存放的。取某个二进制数的补码,例如10000101(十进制数-5)的补码,步骤如下:(1)求原码的反码。把原码除符号位之外的二进制码按位取反,即把1变成0,0变成1,即得到该原码的反码。例如10000101的反码为11111010。(2)把所得的反码加1,即得到原码的补码。因此11111010加1得11111011,这就是-5在内存中的二进制码。若用两个字节表示,即为:11111111111110112.把内存中以补码形式存放的二进

20、制码转化成十进制的负整数,步骤如下:(1)先对除符号位之外的各位取反。例如有补码11111010,取反后为10000101。(2)将所得二进制数转换成十进制数。例如,10000101的十进制数为-5。(3)对所求得的数再减1,即为-6。通过以上分析可知,由两个字节存放的最小整数是1000000000000000,它对应的十进制数为-32768,而-1在内存中存放的二进制码为1111111111111111。三、无符号整数用两个字节存放一个整数时,若说明为无符号整数,则最高位不再用来存放整数的符号,16个二进制位全部用来存放整数,因此无符号整数不可能是负数。这时,若内存中存放的16个二进制位全部

21、为1,则它所代表的整数就不再是-1,而是65535。2.4 实型数据2.4.1 实型常量实型常量又称实数或浮点数。在C语言中可以用两种形式表示一个实型常量。一、小数形式小数形式是由数字和小数点组成的一种实数表示形式,例如0.123、.123、123.、0.0等都是合法的实型常量。注意:小数形式表示的实型常量必须要有小数点。二、指数形式这种形式类似数学中的指数形式。在数学中,一个数可以用幂的形式来表示,如2.3026可以表示为0.23026101、2.3026100、23.02610-1等形式。在C语言中,则以“e”或“E”后跟一个整数来表示以10为底的幂数。2.3026可以表示为0.23026

22、E1、2.3026e0、23. 026e-1。C语言的语法规定,字母e或E之前必须要有数字,且e或E后面的指数必须为整数。如e3、.5e3.6、.e3、e等都是非法的指数形式。注意:在字母e或E的前后以及数字之间不得插入空格。2.4.2 实型变量C语言中实型变量分为单精度型和双精度型两种,分别用类型名float和double进行定义。单精度型变量定义的形式如下:float a,b,c;双精度型变量定义的形式如下:double x,y,z;在一般计算机系统中,为float类型的变量分配4个字节的存储单元,为double类型的变量分配8个字节的存储单元,并按实型数的存储方式存放数据。实型的变量只能

23、存放实型数,不能用整型变量存放一个实数,也不能用实型变量存放一个整数。在VC6.0中单精度实数(float类型)的数值范围约在-10381038之间,并提供7位有效数字位;绝对值小于10-38的数被处理成零值。双精度实数(double类型)的数值范围约在-1030810308之间,并提供1516位有效数字位,具体精确到多少位与机器有关;绝对值小于10-308的数被处理成零值。因此double型变量中存放的数据要比float型变量中存放的数据精确得多。注意,在VC6.0中,所有的float类型数据在运算中都自动转换成double型数据。前面已经介绍过,在程序中一个实数可以用小数形式表示,也可以用

24、指数形式表示。但在内存中,实数一律是以指数形式存放的。注意:在计算机中可以精确地存放一个整数,不会出现误差,但整型数值的数值范围比实数小。实型数的数值范围较整型大,但往往存在误差。2.5 算术表达式2.5.1 基本的算术运算符在C语言中,基本的算术运算符是:+、-、*、/、%,分别为加、减、乘、除、求余运算符。这些运算符需要两个运算对象,称为双目运算符。除求余运算符%外,运算对象可以是整型,也可以是实型。如1+2、1.2*3.2。求余运算符的运算对象只能是整型。在%运算符左侧的运算数为被除数,右侧的运算数为除数,运算结果是两数相除后所得的余数。当运算数为负数时,所得结果的符号随机器的不同而不同

25、。“+”和“-”也可用作单目运算符,运算符必须出现在运算数的左边。运算数可为整型,也可为实型。如:-54、+3.9。说明:(1)如果双目运算符两边运算数的类型一致,则所得结果的类型与运算数的类型一致。例如:1.0/2.0,其运算结果为0.5;1/2,其运算结果为O。(2)如果双目运算符两边运算数的类型不一致,系统将自动进行类型转换,使运算符两边的类型达到一致后,再进行运算。(3)在C语言中,所有实型数的运算均以双精度方式进行。若是单精度数,则在尾数部分添0,使之转化为双精度数。2.5.2 运算符的优先级、结合性和算术表达式在C语言中,常量、变量、函数调用以及按C语言语法规则用运算符把运算数连起

26、来的式子都是合法的表达式。凡是表达式都有一个值,即运算结果。一、算术运算符的优先级算术运算符和圆括号的优先级高低次序如下:二、算术运算符和圆括号的结合性以上所列的运算符中,只有单目运算符“+”和“-”的结合性是从右到左的,其余运算符的结合性都是从左到右。例如:表达(5+1)/2的运算结果是3,圆括号的优先级高于除号;表达式5+1/2的运算结果是5,除号的优先级高于加号;表达式5*-2的褥算结果是-1O,单目运算符“-”的优先级高于乘号,这个表达式与5*(-2)等价。三、算术表达式用算术运算符和一对圆括号将运算数(或称操作数)连接起来的、符合C语言语法的表达式称为算术表达式。算术表达式中,运算对

27、象可以是常量、变量和函教等。例如:2+sqrt(c)*b。在计算机语言中,算术表达式的求值规律与数学中四则运算的规律类似,其运算规则和要求如下:(1)在算术表达式中,可使用多层圆括号,但左右括号必须配对。运算时从内层圆括号开始,由内向外依次计算表达式的值。(2)在算术表达式中,若包含不同优先级的运算符,则按运算符的优先级由高到低进行;若表达式中运算符的级别相同,则按运算符的结合方向进行。例如表达式a+b-c,因为+号和-号的优先级相同,它们的结合性为从左到右,因此先计算a+b,然后把所得结果减去c的值。2.5.3 强制类型转换表达式强制类型转换表达式的形式如下:(类型名)(表达式)上述形式中,

28、(类型名)称为强制类型转换运算符,利用强制类型转换运算符可以将一个表达式的值转换成指定的类型,这种转换是根据人为要求进行的。例如:表达式(int)3.234把3.234转换成整数3;表达式(double)(10%3)把10%3所得结果1转换成双精度数。2.6 赋值表达式2.6.1 赋值运算符和赋值表达式在C语言中,赋值号“=”是一个运算符,称为赋值运算符。由赋值运算符组成的表达式称为赋值表达式,其形式如下:变量名=表达式赋值号的左边必须是一个代表某一存储单元的变量名,对于初学者来说.只要记住赋值号左边必须是变量名即可。赋值号的右边必须是C语言中合法的表达式。赋值运算的功能是先求出右边表达式的值

29、,然后把此值赋给赋值号左边的变量,确切地说,是把数据存入以该变量为标识的存储单元中去。例如,a和b都被定义成int类型变量:a=10; /*把常量l0赋给变量a*/b=a; /*把a中的值赋给变量b,a中的值不变*/在程序中可以多次给一个变量赋值,每赋一次值,与它相应的存储单元中的数据就被更新一次,内存中当前的数据就是最后一次所赋的那个数据。说明:(1)赋值运算符的优先级别只高于逗号运算符,比任何其他运算符的优先级都低,且具有自右向左的结合性。因此,对于如下的表达式:a=2+7/3由于所有其他运算符的优先级都比赋值运算符高,所以先计算赋值运算符右边表达式的值,再把此值赋给变量a。(2)赋值运算

30、符不同于数学中的“等于号”,这里不是等同的关系,而是进行“赋予”的操作。(3)赋值表达式x=y的作用是,将变量y所代表的存储单元中的内容赋给变量x所代表的存储单元。x中原有的数据被替换掉。赋值后,变量y中的内容保持不变。此表达式应当读作“把右边变量的值赋给左边变量”,而不应读作“x等于y”。(4)在赋值表达式x=x中,虽然赋值运算符两边的运算对象都是x,但出现在赋值号左边和右边的x具有不同的含义。赋值号右边的x表示变量x所代表的存储单元中的值。赋值号左边的x代表以x为标识的存储单元。该表达式的含义是取变量x中的值放到变量x中去。当然,这一操作并无实际意义。表达式n=n+1也是合法的赋值表达式,

31、其作用是取变量n中的值加1后再放回到变量n中,即使变量n中的值增1。(5)赋值运算符的左侧只能是变量,不能是常量或表达式。a+b=c就是非法的赋值表达式。(6)等号右边的表达式也可以是一个赋值表达式。如a=b=7+1,按照运算符的优先级,将首先计算出7+1的值8,然后按照赋值运算符自右向左的结合性,把8赋给变量b,最后再把变量b的值赋给变量a。而表达式a=7+1=b则是不合法的,因为在7+1=b中,在赋值号的左边不是一个变量。(7)在C语言中,“=”号被视为一个运算符,a=19是一个表达式,而表达式应该有一个值,C语言规定最左边变量中所得到的新值就是赋值表达式的值。(8)C语言的赋值表达式可以

32、作为语句中的某个成分出现在众多的语句或表达式中,从而使变量中的数值变化过程变得难于掌握。因此要求读者在学习过程中建立正确的概念,才能准确掌握赋值表达式的运算规律。2.6.2 复合赋值表达式 a=4+5*23/(7-9)=4+5*23/(-2)在赋值运算符之前加上其他运算符可以构成复合赋值运算符。C语言规定可以使用10种复合赋值运算符,其中与算术运算有关的复合赋值运算符有:+=、-=、*=、/=、%=(注意:两个符号之间不可以有空格)。复合赋值运算符的优先级与赋值运算符的优先级相同。表达式n+=1的运算规则等价于n=n+1,表达式n*=m+3的运算规则等价于n=n*(m+3),因为运算符“+”的

33、优先级高于复合赋值运算符“*=”。其他以此类推。a/=b-4 a=a/(b-4)例2.3 已有变量a,其值为9,计算表达式a+=a-=18的值。因为赋值运算符与复合赋值运算符“-=”和“+=”的优先级相同,且运算方向自右至左,所以:(1)先计算“a+a”;因a的初值为9,所以该表达式的值为18,注意a的值求变。(2)再计算“a-=18”,此式相当于“a=a-18”,因a的值仍为9,所以表达式的值为-9,注意a的值已为-9。(3)最后计算“a+=-9”,此式相当于“a=a+(-9)”,因a的值此时已是-9,所以表达式的值为-18。由此可知,表达式a+=a-=a+a的值是-18。2.6.3 赋值运

34、算中的类型转换在赋值运算中,只有在赋值号右侧表达式的类型与左侧变量类型完全一致时,赋值操作才能进行。如果赋值运算符两侧的数据类型不一致,在赋值前,系统将自动先把右侧表达式求得的数值按赋值号左边变量的类型进行转换,也可以用强制类型转换的方式人为地进行转换后将值赋给赋值号左边的变量。这种转换仅限于数值数据之间,通常称为“赋值兼容”。对于另外一些数据,例如后面将要讨论的地址值就不能斌给一般的变量,称为“赋值不兼容”。在这里,特别需要指出的是在进行混合运算时整型数据类型之间的转换问题。在C语言的表达式(不包括赋值表达式)中,如果运算符两边的整数类型不相同,将进行类型之间的转换。转换规则如下:(1)若运

35、算符两边一个是短整型,一个是长整型,则将短整型转换为长整型,然后进行运算。(2)若运算符两边一个是有符号整型,一个是无符号整型;则将有符号整型转换成无符号整形,然后进行运算。100001001101100在C语言的赋值表达式中,赋值号右边的值先转换成与赋值号左边的变量相同的类型,然后进行赋值。应当注意:(1)当赋值号左边的变量为短整型,右边的值为长整型时,短整型变量只能接受长整型数低位上两个字节中的数据,高位上两个字节中的数据将丢失。也就是说,右边的值不能超出短整型的数值范围,否则将得不到预期的结果。例如,若有以下定义和语句:short a;unsigned long b;b=98304; a

36、=b;printf(%dn,a);则a中的值为-32768。因为98304(二进制数11000000000000000)已经超出短整型的数值范围(-3276832767),a截取b中低16位中的值(二进制数1000000000000000),由于最高位为1,因此。中的值为-32768。(2)当赋值号左边的变量为无符号整型,右边的值为有符号整型时,则把内存中的内容原样复制。右边数值的范围不应超出左边变量可以接受的数值范围。同时要注意,这时负数将转换为正数。例如,变量。被说明为unsigned类型,(3)当赋值号左边的变量为有符号整型,右边的值为无符号整型时,复制的机制同上。这时若符号位为1,将按

37、负数处理。2.7 自加、自减运算符和逗号运算符2.7.1 自加运算符“+”和自减运算符“-”(1)自加运算符“+”和自减运算符“-”的运算结果是使运算对象的值增1或减1。如i+,相当于i=i+1;i-,相当于i=i-1。因此,自加或自减运算本身也是一种赋值运算。(2)运算符“+”和“-”是单目运算符,运算对象可以是整型变量也可以是实型变量,但不能是常量或表达式。因为不能给常量或表达式赋值。因此,如+3,(i+j)-等都是不合法的。(3)用自加或自减运算符构成表达式时1既可以前缀形式出现,也可以后缀形式出现。例如:+i,-i,i+,i-等都是合法的表达式。无论是作为前缀运算符还是作为后级运算符,

38、对于变量本身来说自增1或自减1都具有相同的效果,但作为表达式来说却有着不同的值。例如,若变量i为int类型,且已有值为5。若表达式为+i,则先进行i增1运算,i的值为6,表达式的值也为6;若表达式为-i,则先进行i减1运算,i的值为4,表达式的值也为4;若表达式为i+,则表达式先取i的值为5,然后i进行增1运算,使i中的值为6;若表达式为i-,则表达式先取i的值为5,然后i进行减1运算,使i中的值为4。(4)运算符“+”和“-”的结合方向是“自右至左”。例如有一表达式-i+,其中i的原值为3。由于负号运算符与自加运算符的优先级相同,结合方向是“自右至左”,即相当于对表达式-(i+)进行运算,此

39、时自加运算符“+”为后缀运算符,(i+)的值为3,因此-(i+)的值为-3,然后i自增为4。(5)不要在一个表达式中对同一个变量进行多次诸如i+或+i等运算,例如写成:i+*+i+i-*-i,这种表达式不仅可读性差,而且不同的编译系统对这样的表达式将做不同的解释.进行不同的处理,因而所得结果也各不相同。2.7.2 逗号运算符和逗号表达式“,”是C语言提供的一种特殊运算符,用逗号将表达式连接起来的式子称为逗号表达式。逗号表达式的一般形式为:表达式1,表达式2,表达式n。说明:(1)逗号运算符的结合性为从左到右,因此逗号表达式将从左到右进行运算。即,先计算表达式1,然后计算表达式2,依次进行,最后计算表达式n。最后一个表达式的值就是此逗号表达式的值。例如:(i=3,i+,+i,i+5)这个逗号表达式的值是10,i的值为5。(2)在所有运算符中,逗号运算符的优先级最低。

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

当前位置:首页 > 教学课件 > 其他教案课件

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922