- 2022-08-11 发布 |
- 37.5 KB |
- 39页
申明敬告: 本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
文档介绍
c语言学习与复习
第2章C程序设计初步知识本章要点:2.1简单C语言程序的构成和格式2.2常量、变量和标识符2.3整型数据2.4实型数据2.5算术表达式2.5算术表达式2.6赋值表达式2.7自加、自减运算符和逗号运算符\n2.1简单C语言程序的构成和格式以下是一个简单求解两数之和的C程序,程序如下:#include“stdio.h”main(){inta,b,sum;a=12;b=2;/*给求和的两个数赋值*/sum=a+b;/*求两数之和放入变量sum*/printf(“a=%d,b=%d,sum=%d\n”,a,b,sum);/*输出两数以及它们的和*/}以上程序运行结果如下:a=12,b=2,sum=14\n从以上程序中,可以看到C程序有以下结构特征:1.main是主函数名,C语言规定必须用main作为主函数名。其后的“()”中间可以是空的,但“()”不能省略。一个C程序可以包含任意多个不同名的函数,但必须有且只有一个主函数,C程序总是从主函数开始执行。2.在函数的起始行后面是函数体,由一对大括号“{}”括起来的语句集合。函数体中一般包含变量定义语句和执行语句。且执行语句必须放在定义语句之后。3.每个语句和变量定义的最后必须要有一个分号(即使是程序的最后一个语句也应包含分号)。分号是C语句的必要组成部分。\n4.C语言用“/*……*/对程序进行注释。注意“/”和“*”之间不能有空格。注释可以出现在程序中任意合适的地方,必须成对出现,它对程序的运行不起作用,但在注释中可以说明变量的含义、程度段的功能等。一个好的C程序应有必要的注释,以便阅读。5.“#include“stdio.h””通常称为命令行,必须用“#”号开头,最后不能加“;”,因为它不是C程序中的语句。“stdio”是系统提供的文件名,该文件中包含着有关输入输出函数的信息,调用不同的库函数,应当包含不同的头文件。※重点提示:main是主函数名,C语言规定必须用main作为主函数名。每个语句和变量定义的最后必须要有一个分号,分号是C语句的必要组成部分。“#include“stdio.h””是命令行,必须用“#”号开头,最后不能加“;”,因为它不是C程序中的语句。\n2.2常量、变量和标识符2.2.1标识符和其他高级语言一样,用来标识常量名、变量名、函数名、数组名、类型名、文件名等对象的有效字符序列称为标识符。简单的说,标识符就是一个名字。1.标识符的命名规则(1)C语言规定标识符只能由字母(大小写均可)、数字和下划线3种字符组成。(2)第1个字符必须为字母或下划线。\n2.注意事项(1)标识符的命名是区分大小写的,例如NAME、name及Name为3个不同的标识符。习惯上变量名用小写字母表示,符号常量一般使用大写英文字母。(2)C语言中的关键字是一类特殊的标识符,它们具有特定的含义,已被C语言本身使用,不能用作变量名、常量名、函数名等。(3)C语言中提供了大量的库函数与头文件,这些库函数名和头文件中定义的一些标识符都统称为预定义标识符。用户定义标识符时应注意避免和预定义标识符重名。\n3.标识符的分类(1)关键字关键字在程序中代表着固定的含义,不能另作他用。如用来说明变量类型的标识符char、float以及for、if等都已有专门的用途,它们不能用作变量名或函数名。(2)预定义标识符预定义标识符在C语言中也有特定的含义,如库函数的名字和预编译处理命令等。C语言语法允许用户把这类标识符另作他用,但是失去了在系统中规定的原意。为了避免误解,建议用户不要把这些预定义标识符另作它用。\n(3)用户标识符由用户根据需要定义的标识符称为用户标识符。一般用来给变量、函数、数组或文件等命名。如果用户标识符与关键字相同,程序会给出出错信息;若与预定义标识符相同,则预定义标识符将失去原来的含义。※重点提示:标识符的命名规则:(1)C语言规定标识符只能由字母(大小写均可,但区分大小写)、数字和下划线3种字符组成(2)第1个字符必须为字母或下划线(3)已被C语言本身使用,不能用作变量名、常量名、函数名等。\n2.2.2常量在程序运行过程中,其值不能被改变的量称为常量。C语言中有4中基本常量:整型常量、实型常量、字符常量和字符串常量。此外,C语言中还经常使用两种表现形式不同的常量:转义字符常量和符号常量。1.整型常量整型常量也称整数,包括正整数、负整数和零。2.实型常量实型常量即实数,又称为浮点数。\n3.字符常量字符常量使用一对单引号括起来的一个字符。如‘a’、‘B’、‘?’等。以下是关于字符常量的几点说明。(1)单引号只是作为定界符使用,并不是字符常量的组成部分。(2)单引号内的字符不允许是单引号或反斜杠。(3)字符常量具有数值,这个值就是该字符在规定的字符集中的ASCII代码值。(4)字符常量在机器内以整型常量的形式存放,因此字符常量与整型常量等价。\n4.字符串常量字符串常量是由一对双引号括起来的字符序列,如“hello”、“howareyou”等。C语言中没有专门存放字符串的字符串变量,因此存放时需要放在一个字符型数组中。5.转义字符常量转义字符常量是以一个“\”开头的字符序列。每个转义字符都有其特定的含义和功能。具体含义将在后面的章节中详细介绍。\n6.符号常量C语言中,允许用一个标识符来代表一个常量,即常量可以用“符号”来代替,代替常量的符号就称为符号常量。以下是几点说明:(1)符号常量在使用之前必须先定义,定义方法为用宏替换“#define”使一个标识符与某个常量相对应,其一般形式为:#define标识符常量表达式<或字符串>。(2)一个#define只能定义一个符号常量。(3)符号常量定义式的行尾没有分号。\n2.2.3变量变量是指在程序运行期间其值可以发生变化的量。一个变量在内存中占据一定的存储单元,在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。变量如常量一样,也分为整型变量,实型变量,字符型变量等。在定义变量的同时要说明该变量的类型,系统编译时根据变量及其类型为它分配相应数量的存储空间。※重点提示:C语言中的基本数据类型有:整型、实型和字符型。\n2.3整型数据2.3.1整型常量1.整型常量的表示形式C语言中整型常量有如下三种表示形式:(1)十进制。用一串连续的数字来表示,如32768,-768,0等。(2)八进制。用数字0开头,各位用0~7这8个数之一表示,如010,011等。在C程序中不能在一个十进制整数前面加前导零。(3)十六进制。用0x或0X开头,各位用0~9以及A~F(或a~f)这16个数之一表示,如0x24B,0X34a等。整型常量又有短整型(shortint)、基本类型(longint)和无符号型(unsigned)的区分。\n2.3.2整型变量整型变量是指值为整数的变量。其命名与标识符的规则相同。变量一经说明,在编译时就能为其分配相应的存储单元。整型变量可分为基本型、短整型、长整型和无符号型四种。基本型的整型变量用类型名关键字int进行定义,如inta;或inta,b,c;基本型整型变量在一般微机中占用2个字节的存储单元,该变量中允许存放的数值范围是:-32768~32767。在程序中定义变量时,编译程序会为相应的变量开辟内存单元,但并没有在该单元中存放任何初值,这时变量中的值是无意义的,即称为变量值“无定义”。C语言规定,可以在定义变量的同时给变量赋初值,即变量的初始化。如:main(){inta=1,b=4,i=8;……}\n2.3.3整型数据的分类整型常量与变量有短整型(shortint)、基本整型(int)、长整型(longint)和无符号型(unsigned),以及有符号型的区分。不同的计算机系统对这几类整型数所占用的字节数和数值范围有不同规定,表2.1列出了微型机中这些类型的整型数所占用的字节数和数值范围。在表示一个长整型常量时,应该在其后面加一字母后缀L(或l),如123L,345l等。\n基本型:以int表示短整型:以shortint或short表示1.类型长整型:以longint或long表示(123l、123L)无符号基本型(unsignedint)无符号型无符号短整型(unsignedshort)无符号长整型(unsignedlong)一个无符号整型变量中可以存放的正数的范围比一般整型变量中正数的范围扩大一倍。inti;/*变量i的数值范围:-32768~32768*/unsignedintj;/*变量j的数值范围:0~65535*/\n2.3.4整数在内存中的存储形式计算机中最小的存储单位是“位(bite)”,8个二进制位组成一个“字节(byte)”,若干个字节组成一个“字(word)”。C语言中,一个int整数通常用两个字节存放,其中最高位(最左边一位)用来存放整数的符号,正整数时最高位为0,负整数时最高位为1。1.正整数C语言中,正整数以原码形式存放。如整数5在内存中的二进制码为:0000000000000101。\n2.负整数C语言中,负整数在内存中是以整数的“补码”形式存放。求某个二进制码的补码,步骤如下:(1)求原码的反码,即将0→1,1→0(2)将所得的反码加1,即得原码的补码。3.无符号整数无符号整数的最高位不再用来存放整型的符号,因此无符号数不可能是负数。对于无符号整数,最高位(最左边一位)不再用来存储整数的符号,全部用来存放整数。※重点提示:在C语言中,对于有符号整数,用最高位(最左边一位)用来存储整数的符号,若是正整数,最高位为0,若是负数,最高位放置1。对于正整数用“原码”形式存放,对于负整数用“补码”形式存放。\n2.4实型数据2.4.1实型常量1.实型常量的表示形式实型常量又称实数。在C语言中可以有两种表示形式:(1)小数形式。由整数部分、小数点和小数部分组成。格式如下:±整数部分.小数部分,小数点不能省略。如0.78,﹣.897,0.0都是合法实数表示。(2)指数形式。由尾数部分、字母E或e和指数部分组成,其格式如下:±尾数部分E(或e)±指数部分,指数部分只能是整数,且三个组成部分均不能省略。如12.34E+9,﹣5.453e﹣10是合法的实数表示,如果写成e2、.6E3.5、.e2、e、E等都是不合法的指数形式。注意,在字母E(或e)的前后以及数字之间不得插入空格。※重点提示:±尾数部分E(或e)±指数部分,指数部分只能是整数,且三个组成部分均不能省略。\n2.4.2实型变量1.实型变量是指值为实数的变量。其命名与标识符的规则相同。2.实型变量分为两种类型:(1)单精度型(float),分配4个字节的存储单元,数值范围约为﹣1038~1038,并提供7位有效位;小于1038的数被处理成零值。(2)双精度型(double),分配8个字节的存储单元,数值范围约为﹣10308~10308,并提供15~16位的有效位;小于10308的数被处理成零值。在计算机内存中,实数一律是以指数形式存放的,而不是小数的形式。例如:floata;doubleb;a=123456.789e5;b=123456.789;\n2.5.1基本的算术运算符C语言中基本的运算符是:+、-、*、/、%。这些运算符需要两个运算对象,称为双目运算符。除求余运算符外,运算对象可以是整型也可以是实型。说明:(1)乘号“*”不能省略,也不能写成代数式中的“×”或“.”\n(2)若双目运算符两边的类型不一致,则系统将自动按照类型转换规则使两边类型一致后再进行运算。如一边是实型数,一边是整型数时,系统将自动把整型转换为实型数再进行运算。(3)求余运算符“%”要求参与运算的量必须为整数,且求余的结果符号与被除数相同。如14%-3的结果为2,-21%4的结果为-1。(4)在C语言中,所有实型数的运算均以双精度方式进行。若是单精度数,则在尾数部分补0,使之转化为双精度数。\n2.5.2运算符的优先级、综合性和算术表达式在C语言中,常量、变量、函数调用以及按C语言语法规则用运算符把运算数连起来的式子都是合法的表达式。表达式都有一个值,即运算结果。1.算术运算符和圆括号的优先级次序如下:(由高→低)()、﹢、﹣、*、/、%、+、-\n2.算术运算符和圆括号的结合性以上所列的运算符,只有单目运算符“+”和“-”的结合性是从右到左,其余运算符的结合性都是从左到右。如,表达式(4+3)*5/2的运算结果是17,圆括号的优先级要高于乘号和除号;而表达式4+3*5/2的运算结果是11,乘号和除号的优先级要高于加号;表达式3*-4与3*(-4)是等价的,因为单目运算符”-“的优先级高于乘号。\n3.算术表达式用算术运算符和括号将运算对象连接起来的、符合C语法规则的式子,称C算术表达式。运算对象可以是常量、变量、函数等。关于算术表达式的几点说明:(1)在表达式中可以使用多层圆括号,但左右括号必须配对。运算时从内层开始,由内向外依次计算表达式的值。(2)在求解表达式的值时,若包含不同优先级的运算符,则按运算符的优先级别由高到低运行,若表达式中运算符的级别相同,则按运算符的结合方向进行。如表达式a+b-c,因为加号和减号的优先级相同,它们的结合性为从左到右,因此先计算a+b,然后把所得的结果减去c。\n2.5.3强制类型转换表达式强制类型转换表达式的形式:(类型名)(表达式)其中(类型名)称为强制类型转换运算符,例如:(float)(x)将x转换成浮点型(double)(8%3)将8%3转换成双精度型※重点提示:在求解表达式的值时,若包含不同优先级的运算符,则按运算符的优先级别由高到低运行,若表达式中运算符的级别相同,则按运算符的结合方向进行。\n2.6赋值表达式2.6.1赋值运算符和赋值表达式1.赋值运算符赋值符号“=”称为简单运算符,其作用是将一个数据或运算表达式的值赋给另一个变量。例如:a=5的作用是把5赋给变量a,即把5存入变量a对应的存储单元。关于简单的赋值运算,要注意以下2点:(1)赋值符“=”左边必须是变量,右边既可以是常量,变量,也可以是函数调用或表达式。如z=sqrt(3)+2*c。(2)赋值符“=”与数学中的等号“=”外观相同,但含义、作用不同,如i=i+1,在数学中是不成立的,但在C语言中是正确的。它的含义是将i当前值加1再赋给变量i。\n2.赋值表达式用一个赋值运算符“=”将一个变量和一个表达式连接起来的式子称为赋值表达式。其一般形式为: 变量=表达式赋值号的左边必须是一个代表某一存储单元的变量名,或代表某存储单元的表达式,赋值运算的功能是先求出右边表达式的值,然后把该值赋给等号左边的变量,即是把数据放入以该变量为标识的存储单元中去。如a=1b=a/*是将常量1赋给变量a,再把a中的值赋给变量b,但a中的值不变*/\n程序中可以多次给一个变量赋值,相应的存储单元当前的数据就是最后一次所赋的那个数据。以下是几点说明:(1)赋值表达式右边的“表达式”,也可以是一个赋值表达式,即出现多个赋值符号的情况。例如:a=(b=3),它相当于b=3。(2)赋值表达式中还可以包含复合的赋值运算符,例如:x+=y*=3也是一个赋值表达式,假设x的初值是5,y的初值是2,则该赋值表达式运算顺序为:先进行y*=3的运算,再进行x+=6的运算,相当于x=x+6=5+6,因此最后结果是11。\n(3)如果在赋值表达式最后加一个分号就构成了语句。(4)在C语言中规定最左边变量所得到的新值就是赋值表达式的值,如a=18,则表明该表达式的值为18。(5)赋值运算符的左边只能是变量,不能是常量或表达式。如a+b=c是不合法的赋值表达式。2.6.2复合的赋值表达式\n2.6.2复合的赋值表达式1.复合的赋值运算符在赋值符“=”之前加上其他运算符,可以构成复合的赋值运算符。例如在“=”前加上“+”运算符,就成了复合运算符“+=”。例如有:x+=4它相当于表达式:x=x+4即先使x加4,再赋给x。\n采用这种复合运算符,一是为了简化程序,二是为了提高编译效率,C语言规定可以使用以下10种复合赋值运算符,如下:+=、﹣=、*=、%=、<<=、>>=、&=、^=、\=、|=其中后五种是有关位运算方面的,将在后续章节中介绍。注意:复合赋值运算符的优先级与赋值运算符的优先级相同。\n2.复合的赋值表达式如已有变量a,值为3,计算表达式a+=a-=a+a的值。因为赋值运算符与复合的赋值运算符的优先级相同,且运算方向自右向左,所以计算步骤为:(1)先计算a+a,该表达式值为6。(2)再计算a-=6,即a=a-6,此时a的值仍为3,所以表达式值为-3。(3)最后计算a+=-3,即a=a+(-3),此时a的值已经改变为-3,所以表达式的值为-6。即表达式a+=a-=a+a最终的值为-6,而a最终的值也是-6。\n2.6.3赋值运算中的类型转换如果赋值运算符两侧的类型不同,在赋值时系统要自动进行类型转换,转换原则是不论赋值号两侧类型级别高低如何,一律将赋值号右边的类型转换成左边变量的类型,然后再赋值,具体规定如下:1.将实数赋给整型变量时,舍弃实数的小数部分(不是四舍五入)。例如i是整型变量,则i=2.99;结果i的值为2,在内存中以整数形式存储。2.将整数赋给单、双精度变量时,数值不变,但将整数转换成浮点数形式存放到左边的变量中。例如:floatx,x=2,结果是将2转换成2.000000赋给变量x。\n3.将字符型赋给整型时,由于字符型为1个字节,而整型是2个字节,故将字符的ASCII码值放到整型量的低8位中,高8位为0。4.将整型赋给字符型时,只把低8位赋给字符量。※重点提示:赋值运算符的左边只能是变量,不能是常量或表达式。计算表达式的值时,参加运算的各个数据类型都转换成数据长度最长的数据类型,然后再计算,计算的结果是数据长度最长的数据类型。\n2.7自加、自减运算符和逗号运算符2.7.1自加运算符和自减运算符自增运算符(++)是使运算量增加1,自减运算符(--)是使运算量减1,它们有以下几种形式:++aa值先增加1后再参与其他运算a++先参与其他运算再使a值增加1--aa值先减少1后再参与其他运算a--先参与其他运算再使a值减少1\n关于自增和自减运算,要注意以下几点:(1)++a和a++的区别。(2)自增和自减运算符只能用于变量,不能用于常量或表达式,如2++是不合法的。(3)但自增、自减运算符和其他运算符混合使用时,应注意其结合性为“自右向左”,如-a++,即相当于-(a++)。2.7.2逗号运算符和逗号表达式“,”是C语言提供的一种特殊运算符,用逗号将表达式连接起来的式子称为逗号表达式。其一般形式为:表达式1,表达式2,……,表达式n\n说明:1.逗号运算符的结合性为从左到右,先计算表达式1,最后计算表达式n,最后一个表达式的值就是该逗号表达式的值。2.逗号运算符再所有运算符中优先级最低。3.表达式可以嵌套,即表达式1和表达式2本身也可以是逗号表达式,如(x=2*5,x-3),x*4,整个表达式的值应为40。4.并非所有出现逗号的地方就可以作为逗号表达式,如printf(“%d,%d”,a,b)。※重点提示:自增和自减运算符只能用于变量,不能用于常量或表达式。逗号运算符的结合性为从左到右,最后一个表达式的值就是该逗号表达式的值。查看更多