C语言程序设计全套教案_第1页
C语言程序设计全套教案_第2页
C语言程序设计全套教案_第3页
C语言程序设计全套教案_第4页
C语言程序设计全套教案_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《C语言程序设计》教案

项目1第一个c语言程序章节分析:本章主要讲解C预言的发展、特点,C语言的基本结构,C语言的上机步骤,并能够进行简单的输入输出。教学内容:1、C语言的发展特点;2、C程序的基本结构3、C程序的开发过程4、C程序的上机步骤5、简单的输入输出教学重点:1、C程序的基本结构2、C程序的开发过程3、C程序的上机步骤教学难点1、C程序的上机步骤2、C程序的基本结构课时分配:4课时导入新课:C语言是一种通用的程序设计语言,具有表达简明、使用灵活、结构化的流程控制、丰富的数据结构和操作符集合、良好的程序可移植性和高效率的目标代码特征,是各工科类程序设计的必修课程。第一讲一、C语言概述(一)C语言的发展和特点1、C语言的发展C语言的发展大致可分为3个阶段:(1)C语言的诞生(1970-1973)C语言是1972年贝尔实验室在B语言的基础上设计出来的。(2)C语言的发展(1973-1988)(3)C语言的成熟(1988年至今)2、C语言的特点(1)用C语言编写的程序非常简洁C语言只有32个关键字,9种控制语句,程序书写格式自由。它压缩了其它高级语言中的冗余的部分,表1-1是C语言同Pascal语言和Basic语言的比较。(2)运算符非常丰富C语言有丰富的运算符,共34种运算符和15个等级的运算优先顺序。C语言还把括号、赋值、强制类型转换等都作为运算符处理。如此丰富的运算符使运算表达式简洁多样化,且编译处理也统一简单。灵活地使用这些运算符可以实现在其它语言中难以实现的运算。(3)数据结构丰富C语言中的数据类型有整型、实型、字符型、数组类型、指针类型、结构体类型等,能够用来实现非常复杂的数据结构的运算,特别是指针类型,使用起来更是灵活、多样。因此,C语言具有较强的数据处理能力。(4)具有结构化的控制语句C语言提供了if-else、for、while、switch等结构化控制语句,便于采用自上而下、逐步细化的结构化程序设计方法,符合现代编程风格的要求。(5)程序设计自由度大C语言的语法限制不太严格,如对数组下标越界不作检查,各种类型的变量可以通用等。C语言允许程序编写者有较大的自由度,因此放宽了语法检查。程序员应当仔细检查程序,保证其正确,而不要过分依赖C编译程序去差错。(6)比较接近硬件与系统C语言能实现汇编语言的大部分功能,如允许直接访问地址、能进行位运算、可以直接对硬件进行操作等。(7)程序执行效率高生成的目标代码质量高,程序执行效率高,一般只比汇编语言生成的代码效率低10%~20%。(8)可移植性好C语言基本上不用修改就可用于各种型号的计算机和各种操作系统。二、C语言程序的基本结构下面先介绍几个简单的C程序,从中分析C程序的特性。例1输出一条信息。main(){printf("Thisismyfirstprogram.\n");}运行结果:Thisismyfirstprogram.程序分析:这个程序的运行结果是在屏幕上输出一行字符。其中main()被称作“主函数”,在任何一个C程序中都必须有一个且只有一个main()函数。这个main()函数中可以有很多语句,用一对大括号括起来。我们这个程序中,只有一条语句。这条语句是一个输出函数,作用是向屏幕上输出信息。它将""之间的内容完整的输出到屏幕。“\n”表示换行符,它的作用是将光标移到下一行的开始。语句后面有一个分号,表示该语句结束,这个分号是必不可少的。例2计算两个数的和。main()

/*主函数*/{intx,y,sum;/*定义变量*/x=1999;y=1;

/*给变量赋值*/sum=x+y;

/*求和*/printf("Thesumis%d",sum);/*输出*/}运行结果:Thesumis2000程序分析:这个程序是求x与y的和sum,并将结果输出到屏幕上。程序中以“/*”开头到“*/”结尾之间的内容表示注释,注释部分不参与也不影响程序的运行,这些注释只是用来帮助人们阅读程序的,注释部分可以加在程序的任何部分。第三行是变量定义,说明了三个整型变量x、y和sum。第四行是赋值语句,给变量x和y赋值。第五行将x+y的和送入变量sum中。第六行是将结果输出到屏幕,“%d”表示“十进制整数类型”,在执行输出时在这个位置上将用一个十进制的整型数值代替,这个程序中用sum的值2000来代替%d这个位置上的内容。例3由用户输入两个整数,计算并输出两个数中最大的一个。main()

/*主函数*/{intx,y,z;

/*定义变量*/scanf("%d,%d",&x,&y);

/*从键盘输入两个数*/z=max(x,y);

/*找出最大的一个数并赋给Z*/printf("TheMaxnumberis%d",z);/*输出*/}intmax(intx,inty){intz;if(x>y)z=x;

/*如果X大于Y就将X的值赋给Z*/elsez=y;

/*否则就将Y的值赋给Z*/return(z);运行结果:3,5↙TheMaxnumberis5程序分析:这个程序包括两个函数,一个是主函数main(),另一个是用户自定义函数max(),求出两个整数x,y中最大的一个数。在执行时,先由scanf()函数(C语言提供的标准输入函数)从键盘读取两个数字,“%d,%d”用于指出输入的两个数据按十进制整数输入,&x和&y中的“&”表示“地址”,scanf()函数是将两个数值分别输入到变量x和y地址所标志的单元中来完成x和y值的输入。这时由用户从键盘上输入3,5↙(“↙”表示回车键),此时x被赋值3,y被赋值5。然后执行第五行,将x和y的值传入max函数中。在max函数中经过判断后,z中的值就是两个数的最大值。用return语句将z的值当做函数的返回值。此时程序又回到第五行,将max函数的返回值赋值给变量z。第六行,将变量z的值输出到屏幕上。运行结果:3,5↙TheMaxnumberis5程序分析:这个程序包括两个函数,一个是主函数main(),另一个是用户自定义函数max(),求出两个整数x,y中最大的一个数。在执行时,先由scanf()函数(C语言提供的标准输入函数)从键盘读取两个数字,“%d,%d”用于指出输入的两个数据按十进制整数输入,&x和&y中的“&”表示“地址”,scanf()函数是将两个数值分别输入到变量x和y地址所标志的单元中来完成x和y值的输入。这时由用户从键盘上输入3,5↙(“↙”表示回车键),此时x被赋值3,y被赋值5。然后执行第五行,将x和y的值传入max函数中。在max函数中经过判断后,z中的值就是两个数的最大值。用return语句将z的值当做函数的返回值。此时程序又回到第五行,将max函数的返回值赋值给变量z。第六行,将变量z的值输出到屏幕上。从以上3个例子,可以看到C程序有以下结构特征。1、C程序是由函数构成的。一个程序至少要有一个主函数main()(main()函数必须且只有一个),也可以包含一个main()函数和若干个其它的函数。因此函数是C程序的基本单位。C语言中提供了丰富的函数,被称作库函数。标准C中提供了一百多个库函数,TurboC和MSC中提供了三百多个库函数。C程序的函数式结构使得C程序非常容易实现模块化,便于阅读和维护。2、一个函数由两大部分组成。第一部分是函数的说明部分,如函数的名称,函数的返回值类型,函数的参数及类型。3、C程序总是从main()函数开始执行,不论main()函数在程序的什么地方,也就是说,可以将main()函数放在程序的任何位置。4、C程序的书写格式比较自由,可以在一行上写若干语句,也可以在多行上写一条语句。5、每个语句后面都必须要有一个分号,分号是C语言中必要的组成部分。6、C语言中没有专门的输入、输出语句,输入输出是通过scanf()和printf()两个库函数实现的。7、C程序中可以用/**/对任何部分进行注释,好的程序都要有必要的注释,以提高程序的可读性。从书写清晰,便于阅读、理解、维护的角度出发,在书写程序时应遵循以下规则:1、一个说明或一个语句占一行。2、用{}括起来的部分,通常表示了程序的某一层次结构。{}一般与该结构语句的第一个字母对齐,并单独占一行。例如:{printf("Thisismyfirstprogram.\n");}3、低一层次的语句或说明可比高一层次的语句或说明缩进若干格后书写。以便看起来更加清晰,增加程序的可读性。在编程时应力求遵循这些规则,以养成良好的编程风格。三、C程序的开发过程具体过程如下:1、编辑。将源程序编辑后,以文本形式保存到磁盘中。源程序文件名由用户自己选定,但扩展名必须为“.c”,例如“f.c”。2、编译。编译的功能是调用“编译程序”将已经编辑好的源程序翻译成二进制的目标代码。系统对源程序进行编译的同时,还对源程序的语法进行检查。当发现错误时,会在屏幕上列出错误的位置和种类。此时要再次使用编辑工具对源程序进行排错修正。如果源程序没有语法错误,编译后将产生一个与源程序同名,以“.obj”(在MS-DOS系统下)为扩展名的目标程序。例如,编译源程序f.c,将产生目标程序f.obj。3、连接。编译后产生的目标程序还不能直接运行,因为每一个模块往往都是单独编译的,需要把各模块编译后得到的目标程序与系统提供的标准库函数等连接后才能运行。连接过程是使用系统提供的“连接程序”进行的,连接后产生以“.exe”(在MS-DOS系统下)为扩展名的可执行程序,例如“f.exe”。4、运行。可执行目标程序生成后,就可以在操作系统的支持下运行。若执行结果达到预期的目的,则开发工作到此完成。否则,要进一步检查修改源程序,再经过“编辑→编译→连接”的过程,直到取得正确的运行结果为止。c程序书写格式(1)c程序的每一条语句都必须以分号“;”结束。(2)程序行的书写格式自由,既允许1行内写几条语句,也允许1条语句分写在几行上。(3)为避免遗漏必须配对使用的符号,例如注释符号、函数体的起止标识符(花括号)圆括号等。(4)关健语句要有使用注释,C系统不对注释符进行编译。C语言的注释格式为:/*……*/。“/*”和“*/”必须成对使用,且“/”和“*”、以及“*”和“/”之间不能有空格,否则都出错。注释的位置,可以单占1行,也可以跟在语句的后面。(5)用{}括起来的部分,通常表示了程序的某一层次结构。{}一般与该结构语句的第一个字母对齐,并单独占一行。(6)低一层次的语句或说明可比高一层次的语句或说明缩进若干格后书写。以便看起来更加清晰,增加程序的可读性。四、简单的输入与输出一个完整的计算机程序,常常要具备输入/输出功能。但C语言本身没有实现输入/输出的语句,必须调用系统函数完成。(一)、格式化输入/输出函数1、输出函数printf()格式:printf(“输出格式”,输出项系列)2、输入函数scanf()格式:scanf(“输入格式”,输入项系列)(二)字符输入/输出函数1、字符输入函数getchar()格式:C=getchar();2、字符输出函数putchar()格式:putchar(c)作业:1、C程序的书写格式是什么样的?2、C程序的执行过程是什么样的?3、编写程序,输出“helloword”!小结:本讲主要介绍了C语言的发展特点,基本结构,以及C程序的基本格式,C程序开发的过程等,重点掌握C程序的开发过程,输入与输出字符等,并能熟练应用。

项目2C语言编程基础章节分析:本章将首先讨论C语言中与数据描述有关的问题,包括数据与数据类型、常量和变量等。然后介绍C语言对数据运算的有关规则,包括运算类型、运算符和表达式等。教学内容:1、正确掌握C语言各种数据类型。2、运算符、运算符的优先级及结合规则。3、了解不同类型数据间的转换原则教学重点:1、C语言的数据类型。2、常量和变量。3、C语言表达式,教学难点1、C语言的数据类型。2、C语言表达式,课时分配:4课时导入新课:程序处理的对象是数据,编写程序也就是描述对数据的处理过程。在写程序的过程中必然要涉及数据本身的描述问题。第一讲一、C语言的数据类型计算机的基本功能是处理数据。所以任何程序设计都要涉及两个问题:问题一:对“数据”的描述。在程序中需要指定数据的类型及数据的组织形式,即数据结构。问题二:对“动作”的描述。指对数据的加工处理步骤与过程,也就是算法。数据是操作对象,操作的目的是对数据进行加工处理,以得到预期的结果。数据是程序的基本部分,如果没有数据,程序就无法运行;仅有数据,而无任何动作,程序也无任何意义。对于相同的数据进行不同的加工得到的结果也不同,所以程序设计人员在进行程序设计时必须认真考虑应如何选择和设计合适的数据结构和合理的、最佳的操作步骤(算法)。因此,著名的计算机科学家沃思(NikiklausWirth)提出了一个公式:数据结构+算法=程序C语言中,数据结构是以数据类型的形式来体现的,数据类型指数据的内在存储方式。C语言提供了丰富的数据类型,如图1所示。C语言中数据有常量与变量之分,它们分别属于图1所示的这些类型。二、常量在程序运行过程中,其值不能被改变的量称为常量。常量在程序中不需要进行任何说明就可以直接使用,因为常量本身就隐含了它的类型。常量可以是不同类型的数据,如:123、-5、8为整型常量;5.4、0.432为实型常量;‘a’、‘d’为字符常量。C语言中有4种基本常量:整型常量、实型常量、字符常量和字符串常量。此外,C语言中还经常使用两种表现形式不同的常量:转义字符常量和符号常量。1.整型常量整型常量也称整数,包括正整数、负整数和零。在C语言中,整型常量有三种表示形式:(1)十进制。十进制整常数没有前缀,其数码为0~9。以下各数是合法的十进制整常数:237;-568;65535;1627。以下各数是不合法的十进制整常数:023(不能有前导0);23D(含有非十进制数码)。(2)八进制(以数字0开头)。即以0作为八进制数的前缀。数码取值为0~7。八进制数通常是无符号数。以下各数是合法的八进制数:015(十进制为13);0101(十进制为65);0177777(十进制为65535)。以下各数是不合法的八进制数:256(无前缀0);03A2(包含了非八进制数码);-0127(出现了负号)。(3)十六进制(以数字0加字母x或X开头)。其数码取值为0~9,A~F或a~f。以下各数是合法的十六进制整常数:0X2A(十进制为42);0XA0(十进制为160);0XFFFF(十进制为65535)。以下各数是不合法的十六进制整常数:5A(无前缀0X);0X3H(含有非十六进制数码)。在程序中是根据前缀来区分各种进制数的。因此在书写常数时不要把前缀弄错造成结果不正确。整型常数的后缀在16位字长的机器上,基本整型的长度也为16位,因此表示的数的范围也是有限定的。十进制无符号整常数的范围为0~65535,有符号数为-32768~+32767。八进制无符号数的表示范围为0~0177777。十六进制无符号数的表示范围为0X0~0XFFFF或0x0~0xFFFF。如果使用的数超过了上述范围,就必须用长整型数来表示。长整型数是用后缀“L”或“l”来表示的。例如:十进制长整常数158L(十进制为158);358000L(十进制为-358000)。八进制长整常数012L(十进制为10);077L(十进制为63)0200000L(十进制为65536)。十六进制长整常数0X15L(十进制为21);0XA5L(十进制为165);0X10000L(十进制为65536)。长整数158L和基本整常数158在数值上并无区别。但对158L,因为是长整型量,C编译系统将为它分配4个字节存储空间。而对158,因为是基本整型,只分配2个字节的存储空间。因此在运算和输出格式上要予以注意,避免出错。无符号数也可用后缀表示,整型常数的无符号数的后缀为“U”或“u”。例如:358u,0x38Au,235Lu均为无符号数。前缀,后缀可同时使用以表示各种类型的数。如0XA5Lu表示十六进制无符号长整数A5,其十进制为165。2.实型常量实型常量即实数,在C语言中又称浮点数,其值有两种表达形式:(1)十进制小数形式。由数字和小数点组成,例如,3.14159,9.8,-12.567等。(2)指数形式。这种形式用来表示一些比较大或比较小的数值,这种形式也由三部分组成,它们是实数部分、字母E或e、整数部分。例如,123x1022可以表示为123E22或123e22。25E-2相当于25x10-2,1.24e3相当于1.24x103等。用指数形式表示实型数据时,在C语言中有如下语法规定:字母e或E之前必须要有数字。字母e或E之后的指数必须为整型。在字母e或E的前后以及数字之间不得插入空格。例如,e6、-2.432E0.5、5.234125e(3+6)、.e5、2.543543E13等都是不合法的指数形式。3.字符常量字符常量是用单引号‘’括起来的一个字符。例如,‘A’、‘1’、‘+’等都是字符常量。以下是几点说明:(1)其中单引号只作为定界符使用,并不是字符常量的组成部分,也就是说在输出字符常量时,一对单引号并不被输出。(2)被一对单引号括起来的字符不允许是单引号或反斜杠,即‘'’、‘\’。(3)在C语言中,字符常量具有数值,这个值就是该字符的ASCⅡ代码值。如‘A’的值为65,‘a’的值为97,‘?’的值为63。(4)字符常量在机器内以整型常量的形式存放(占相同内存单元)。因此,字符常量与整型常量等价。也就是说,字符常量可以像整数一样,在程序中参与各种运算。例如:a=‘D’+8;b=‘?’+‘X’;他们分别相当于下例运算:a=68+8;b=63+88;(5)利用字符常量“既代表一个字符,又具有这个字符的代码值”这一特性,可以方便地实现程序中的一些功能。例如,需判断从键盘输入的一个字符是否为英文小写字母,或判断一个字符是否为数字字符等。解决此类问题的办法就是进行字符的比较,如果逻辑表达式c>=‘a’&&c<=‘z’为真(&&代表“并且”含义),则说明c的ASCⅡ码值介于‘a’与‘z’之间,而26个小写字母的编码值是顺序递增的,所以说明字符c为小写字母。同理,如果c>=‘0’&&‘9’为真,则说明c是数字字符。4.转义字符除了以上形式的字符常量外,C语言还允许用一种特殊的字符常量,即转义字符。转义字符以反斜线"\"开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。例如前面遇到的printf函数的格式串中用到的“\n”就是一个转义字符,其意义是“回车换行”。转义字符主要用来表示那些用一般字符不便于表示的控制代码。表1常用转义字符功能\n回车换行,将光标从当前位置移到下一行开头\t横向跳到下一制表位置,相当于TAB键\b退格,光标从当前位置向左退一格\r回车不换行,光标从当前位置移到本行开头\f换页,将光标从当前位置移到下一页开头\\反斜线符"\"\′单引号符\〞双引号符\?问号\ddd1~3位八进制数所代表的字符\xhh1~2位十六进制数所代表的字符下面分别详述上表中转义字符的各种用途。(1)表1中的前5个转义字符只用于输入输出语句中控制设备的动作,而不作任何显示。如控制输出设备“换行”、“换页”、“退格”、“回车”等。可以借用这种手段输出某些专用字符以达到控制终端设备的目的。【例1】转义字符的使用。main(){Printf(“boy\tgirl\n”);Printf(“︺12︺3\t︺45\r6\t7”);}运行结果:boy︺︺︺︺︺girl612︺3︺︺︺745 程序分析:①程序中的第一个printf()函数先在第1行的第1列位置输出“boy”,然后遇到\t,它的作用是横行跳格,即跳到下一个TAB位置,在我们所用的计算机系统中,一个TAB位置占8列,下一个TAB位置从第9列开始,故在第9~12列上输出“girl”。下面遇到\n,它代表回车换行,所以当前输出位置移至第2行的第1列处。②在第2行的开始输出“︺12︺3”,然后遇到\t,当前输出位置跳到第9列,在9、10、11这3列位置上输出“︺45”。下面遇到\r,它代表回车但不换行,所以返回到本行第1列输出字符“6”,然后遇到\t,再使当前输出位置;移到第9列,输出“7”。③注意第2行在显示屏上最后看到的结果与上述打印机结果不同,为:6︺︺︺︺︺︺︺745这是由于\r使当前位置回到本行开头,自此输出的字符(包括空格和跳格所经过的位置)将取代原来屏幕上该位置上显示的字符。所以原有的“︺12︺3︺︺︺︺”被新的字符“6︺︺︺︺︺︺︺7”代替,其后的“45”未被新字符取代。实际上,屏幕上完全按程序要求输出了全部的字符,只是在输出前面的字符后又很快输出后面的字符,在你未看清之前,新的字符已取代了旧的字符,所以误以为屏幕没输出应输出的字符。(2)表1中的“\\”、“\’”、“\””分别代表单斜杠“\”、单引号“‘”及双引号“””。例如:printf(“\”\\Isay:\’Goodby!\’\\\”\n”);输出结果为:“\Isay:’Goodby!’\”(3)表1中后面两个转义字符是用ASCII码值(八进制和十六进制)表示一个字符。例如‘\101’代表ASCII码(十进制数)值为65的字符A。【例2】用转义字符输出可打印字符和不可打印字符。main(){printf("\x4F\x4B\x21\n");/*等价于printf("OK!\n");*/printf("\101\x62\n");}运行结果:OK!Ab5.字符串常量字符串常量是用一对双引号括起来的字符序列。如"Howdoyoudo"、"Goodmorning"都是字符串常量。(1)字符串长度字符串中所含字符的个数称为字符串长度。长度为0的字符串(即一个字符都没有的字符串)称为空串,表示为“”(一对紧连的双引号)。(2)字符串的存储C语言规定:在存储字符串常量时,由系统在字符串的末尾自动加一个\0作为字符串的结束标志。如果有一个字符串为CHINA,则它在内存中的实际存储为如图2-1所示:图1“CHINA”的实际存储结构最后一个字符\0是系统自动加上的。字符常量与字符串常量的区别:①定界符不同:字符常量使用单引号,而字符串常量使用双引号。②长度不同:字符常量的长度固定为1,而字符串常量的长度可以是0,也可以是某个整数。③存储要求不同:字符常量存储的是字符的ASCII码值,而字符串常量除了要存储有效的字符外,还要存储一个结束标志'\0'。注意:在源程序中书写字符串常量时,不必加结束字符\0,系统会自动加上。6.符号常量在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。符号常量在使用之前必须先定义,其一般形式为:#define标识符常量表达式<或字符串>,其中#define是一条预处理命令,也称为宏定义命令,其功能是把该标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符的地方均代之以该常量值。习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。【例3】符号常量的使用#definePI3.1415926#defineR5

main(){

floats;

s=PI*R*R;

printf("s=%f\n",s);

}运行结果:s=78.539815程序分析:本程序在主函数之前由宏定义命令定义PI为3.1415926,定义R为5,在程序中即以3.1415926代替PI,以5代替R。s=PI*R*R等效于s=3.14159*5*5。关于符号常量有几点说明:(1)一个#define语句只能定义一个符号常量,并且只占据一个书写行。(2)由于符号常量定义式不是C语句,所以行尾没有分号。(3)符号常量不是变量,它所代表的值在整个作用域内不能再改变。也就是说,在程序中,不能再用赋值语句对它重新赋值。使用符号常量的好处有两点:(1)含义清楚。如上例程序中,看程序时从PI就可知道它代表圆周率3.1415926。因此定义符号常量名时应考虑“见名知意”,以增强程序的可读性。(2)在需要改变一个常量时能做到“一改全改”。例如在程序中多次用到半径R,如果半径用常数表示,则在半径调整时,就需要在程序中作多次修改,若用符号常量R代表半径,只需要改动一处即可。如:#defineR7则程序中所有以R代表的半径就会一律自动改为7。作业:1、编程求圆的面积。2、将A,B,转换成小写字母。3、常量的定义小结本节主要讲解了数据的基本类型,常量的定义方法,常量的分类以及常量的应用方法。

第二讲上节课讲解了数据的基本类型,以及常量的定义及应用(回顾),本节主要讲解变量的定义、变量的应用以及数据类型的转换。一、变量1、变量和变量的地址变量是指在程序执行过程中其值可以被改变的量。每一个变量都有一个名字,变量的命名应符合标识符的规定,按照“见名知意”的原则自由命名。一个变量在内存中占据一定的存储单元,在该存储单元中存放变量的值。当程序需要处理该变量时,就到存储单元中读取其值。为了便于存储管理,给每个存储单元分配一个序号,这个序号就是地址。对变量的操作(读或写)依据地址进行。换句话说,在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。例如,变量y的值为6,而y的地址为1800H(十六进制),则1800H号存储空间中存储的内容是数值6。如果变量在一个存储单元存不下,则可以使用多个存储单元。当使用多个存储单元时,以第一个存储单元的地址(首地址)作为变量的地址。2、变量的定义在C语言中,任何一个变量在使用之前都必须首先定义它的名字,并说明它的数据类型。也就是说,变量使用前必须先定义,即指定变量名,说明变量数据类型。变量定义的实质是按照变量说明的数据类型为变量分配相应空间的存储单元,在该存储单元中存放变量的值。C语言中,变量使用时遵循“先定义,后使用”的原则。变量定义一般格式:数据类型变量名表;如:inta;说明了一个整型变量,变量名为a。对变量定义说明如下:(1)数据类型:C语言的合法数据类型。如int、short、char、float、double等。(2)变量名表:变量名是C语言合法的标识符。变量名表可以包含多个变量名,彼此之间使用逗号分开,表示同时定义若干个具有相同数据类型的变量,如:floata,b;(3)变量定义语句可以出现在变量使用之前的任何位置,通常放在函数体开头部分。3、整型变量变量可以和数据类型结合起来分类,如整型变量、实型变量、字符变量、数组变量、指针变量等。整型变量是指整数的变量。整型变量可分为以下几类:(1)基本型,类型说明符为int,在内存中占2个字节,其取值为基本整常数。(2)短整型,类型说明符为shortint或short,所占字节和取值范围均与基本型相同。(3)长整型,类型说明符为longint或long,在内存中占4个字节,其取值为长整常数。在实际应用中,变量的值常常是正的,如学号、年龄、销售量等。为了充分利用变量的表数范围,此时可以将变量定义为“无符号”类型。对以上三类都可以加上修饰符unsigned,以指定是“无符号数”。(4)无符号型,无符号型又可分为:无符号整型,

以unsignedint或unsigned表示。无符号短整型,以unsignedshortint或unsignedshort表示。无符号长整型,以unsignedlongint或unsignedlong表示。若不指定为无符号型,缺省的即为有符号型(signed)。无符号整型变量只能存放不带符号的整数,如5、728,而不能存放负数,如-5,-728。C标准没有具体规定以上各类数据所占内存字节数,各种机器在处理上有所不同。以IBMPC为例,整型中各类型符及含义如表2-2所示。变量的字节数反映变量存储值的范围。例如,对于Turbo

C而言,由于int型变量占2个字节,因而int型变量所能存储的值的范围是-32768~32767。如果变量的取值可能超过这个范围,则要考虑选择其它的类型,否则可能会发生数据溢出错误。值得注意的是,在数学中,整数是一个无限集合,但在特定的机器系统中,所表示数的范围是有限的。另外,假设长整数数值为268L,它和基本整型常数268在数值上并无区别。但对于268L来讲,它是长整型,系统将为它分配4个字节的存储空间。而对于基本整型常数268,系统只分配2个字节的存储空间。因此,在运算和输出格式上要予以注意,以免出错。【例1】整型变量的定义和使用。

main()/*求两数和主函数*/{inta,b,c;/*说明a、b为整型变量*/a=32767;/*为变量a赋最大值*/b=3;/*为变量b赋值*/c=a+b;/*计算a+b并将结果赋值给变量c*/printf("c=%d\n",c);}/*输出变量c的值*/运行结果:c=-32766程序分析:而本程序的运行结果应该是:c=32770,可实际运行结果却如上显示。显然这个结果是错误的,但系统没有提示出错。为什么会出现这种情况呢?图2-2是该程序运行后变量a、b、c中的存储情况。由图中可见,a和b的值都没有超出整型数的表示范围,而a加b后应得到32770,这个数已经超出了整型数的表示范围,称为溢出。但这种溢出在内存变量c中的表现形式正好是数值-32766的补码形式,当输出变量c的内容时自然就输出了-32766,造成结果错误。这就是数据溢出导致的结果。对于这种问题,系统往往不给出错误提示,而是要靠正确使用类型说明来保证其正确性。所以要求对数据类型的使用要仔细,对运算结果的数量级要有基本估计。如果把上述程序作以下修改:main(){longa,b,c;/*说明a、b、c为长整型变量*/a=32767;b=3;c=a+b;printf("c=%ld\n",c);/*按长整型格式输出变量c的值*/}即把变量a、b、c定义为长整型,就可以得到正确的运行结果。请思考:如果只把c定义为长整型,a和b还保持整型,结果会怎样?在C程序中,要注意常量与变量的类型匹配问题,例如上述程序中变量c的结果是正整数32770,与之匹配的有longint型,还有unsignedint、unsignedshortint和unsignedlongint等所有无符号整型,因为32770是正数,又没有超出所有无符号整型数的表示范围。而int或shortint型是不能与之匹配的,否则会产生溢出。4.实型变量实型变量是指值为实数的变量,分为单精度(float)、双精度(double)和长双精度(longdouble)三种类型。实型变量的存储长度、取值范围和精度如表2-3所示。实型变量的定义,只需在说明语句中指明实型数据类型和相应的变量名即可。例如:floata,b;/*说明变量a,b为单精度型实数*/doublec,d;/*说明变量c,d为双精度型实数*/longdoublee,f/*说明变量e,f为长双精度型实数*/使用实型变量时特别要注意数据的舍入误差。由于实型变量是用有限的存储单元存储的,因此能提供的有效数位总是有限的,在有效位之外的数字将被舍去。【例2】实型数据的误差问题main(){floata;/*说明变量a为单精度型*/doubleb;/*说明变量b为双精度型*/a=12345.6789;/*为a赋值*/b=0.1234567891234567899e15;/*为b赋值*/printf("a=%f,b=%f\n",a,b);/*输出变量a、b的值*/}运行结果:a=12345.678711,b=123456789123456.797000程序分析:程序为单精度变量a和双精度变量b分别赋值,并不经过任何运算就直接输出变量a,b的值。理想结果应该是照原样输出,即:a=12345.6789,b=0.1234567891234567899e15但运行该程序,实际输出结果是:a=12345.678711,b=123456789123456.797000由于实型数据的有效位是有限的,程序中变量a为单精度型,只有7位有效数字,所以输出的前8位是准确的,第9位以后的数字“711”是无意义的。变量b为双精度型,可有15~16位的有效位,所以输出的前16位是准确的,第17位以后的数字“97000”是无意义的。由此可见,由于机器存储的限制,使用实型数据会产生一些误差,运算次数愈多,误差积累就愈大,所以要注意实型数据的有效位,合理使用不同的类型,尽可能减少误差。5.字符型变量字符型变量用于存放字符常量,即一个字符型变量可放一个字符,所以一个字符型变量占用1个字节的内存容量。说明字符型变量的关键字是char,使用时只需在说明语句中指明字符型数据类型和相应的变量名即可。例如:chars1,s2;/*定义s1,s2为字符型变量*/s1='A';/*为s1赋字符常量'A'*/s2='a';/*为s2赋字符常量'a'*/因为字符型数据在内存中占用一个字节,所以有符号字符型数据的取值范围为-128~127,无符号字符型数据的取值范围为0~255,ASCII字符中的标准字符ASCII代码值为0~127。在TurboC语言中,字符型数据在操作时将按整型数据处理,也就是说字符型数据与整型数据之间可以通用。一个字符型数据既可以以字符形式输出,也可以以整数形式输出。“%c”用以输出字符本身,“%d”用以输出字符的ASCII代码值。【例3】字符型变量的赋值与输出

main(

){charch1;

unsignedcharch2;

ch1='A';

ch2=254;

printf("%c~%d\n",ch1,ch1);printf("%c~%d\n",ch2,ch2);}运行结果:

A~65■~254程序分析:从例2.6可看出,因为ch2定义为unsignedchar,它的ASCII码值为254,输出字符“■”和整数“254”是正确的。试问,如果将ch2定义为char,结果又将会怎样?从ASCII代码表中可以看到每一个大写字母比它相应的小写字母的ASCII代码值小32。即‘A’等于‘a’–32【例4】大写字母转换成相对应的小写字母

main(

){charc1,c2;

c1='A';

c2='B';

c1=c1+32;

c2=c2+32;

printf("%c

%c\n",c1,c2);}运行结果:

a

b该程序的作用是将两个大写字母转换成相对应的小写字母。6.变量的初始化在程序中常常需要对变量赋初值,以便使用变量。语言程序中可有多种方法,其中在定义时赋以初值的方法,这种方法称为初始化。在变量说明中赋初值的一般形式为:类型说明符变量1=值1,变量2=值2,……;例如:inta=5;floatx=3.2,y=3f,z=0.75;charch1='K',ch2='P';对变量的初始化有以下几点说明。(1)变量初始化有点类似于赋值语句,但又不完全相同。赋值语句在程序运行中执行该赋值语句时才对变量置值。变量初始化则是在分配变量的存储空间时立即置值。例如:inta=5;相当于:inta;/*只指定a为整型变量*/a=5;

/*一个赋值语句,将5赋予变量a*/(2)在定义变量时,可以给其中一个变量赋初值,也可以同时给多个变量赋初值。例如:int

i=10,k;/*指定i和k为整型变量,i初值为10*/

chara=‘A’,b=‘B’;/*指定a和b匀为字符型变量,初值分别为'A'和'B'*/可以给部分变量赋初值,如:inta=8,b='A',c,d;如果对几个变量赋以同一个初值时,不能写成:Int

a=b=5;而应写成:Int

a=5,b=5;(3)在C程序中,字符型数据和整型数据可以通用,那么在给整型变量赋初值时,初值可以是一个整型数据,也可以是一个字符型数据。例如:inta=65;等价于:

inta=‘A’;同样,在给字符型变量赋初值时,初值可以是一个字符型数据,也可以是一个整型数据。例如:char

a='a';

等价于

char

a='\141';等价于

char

a=97;二、各类数值型数据间的混合运算C语言规定,基本类型数据可以混合运算。前面已提到,字符型数据可以与整型通用,故整型、实型、字符型间可以混合运算。例如以下表达式:'A'+10-5.78是合法的。C语言还规定,在进行运算时,不同类型的数据要先转换成同一类型,然后才能进行运算。转换分自动转换和强制转换(人工转换),这里只介绍自动转换的规则,如下图所示。图中横向向左的箭头表示必定的转换,纵向的箭头表示当运算对象为不同类型时转换的方向。注意纵向箭头方向只表示数据类型级别的高低,由低向高转换,而不要理解为int型必须先转换成unsigned型,再转成long型,再转换成double型。自动转换遵循以下规则:(1)若参于运算量的类型不同,则先转换成同一类型,然后进行运算。(2)转换按数据长度增加的方向进行,以保证精度不降低。例如int型和long型运算时,先把int型转换成long型后再进行运算。(3)所有的实型数据运算都是以双精度进行的,即使仅含有float单精度量运算的表达式,也要先转换成double型,再做运算,结果double型。(4)char型和short型参与运算时,必须先转换成int型,结果为int型。例如有一表达式式:

'A'+10-5.78运算次序为①进行'A'+10的运算,先将'A'转换成整数65,运算结果为75。②进行75-5.78的运算,由于式中有实型,所以先把75和5.78均转换成double型(在小数点后加若干个0即75.00…0,5.7800…0)后再运算,结果double型。【例5】数据混合运算举例。

main()

{

int

i;

float

x,y;

char

c;

i=2;x=3.0;c='A';

y=2.0+i*c+x;

printf("y=%f\n",y);

}运行结果:y=135.000000程序分析:语句“y=2.0+i*c+x;”中有int、float、char三种类型的数据,它们可以混合运算,运算时将按照上面所述规则进行,“A”字符将以ASCII代码值65与变量i相乘得130,然后将130转换成实型数据参与后面的x相加运算。用来表示各种运算的符号称为运算符。运算符必须要有运算对象。只有一个运算对象的运算符称单目运算符;有两个运算对象的运算符称双目运算符;有三个运算对象的运算符称三目运算符。用运算符把运算对象连接起来所组成的运算式称为表达式。作业:1、下列数据中属于字符串常量的是

c

。A.ABC

B.'ABC'

C."abc"

D.'a'2、下列数据中属于字符常量的是

b。A."A"

B.'\\'

C.w

D.''3、在C语言中,下列哪个是合法的实型常量

c

。A.378e

B.

E-2

C.

1.3145e2

D.2684、下列不合法的变量名为(

a

)。 A.int

B.int1

C.name_1

D.name05、在C语言中,char型数据在内存中的存储形式是

b

A.BCD码

B.ASCII代码值C.内码值

D.十进制代码值6、执行语句“x=(a=5,b=a--);”后,整型变量x,a,b的值依次为

A.5,4,4

B.5,4,5

C.5,5,4

D.4,5,47、表达式“25%3/2”值为

A.0

B.0.5

C.2

D.1 D)若干子程序组成8、运算符+、=、*、>=中,优先级最高的运算符是(

)。A.+

B.=

C.*

D.>=9、下列程序的运行结果是__________main(

)

{chara,b;

a='0';b='5';

printf("%d,%d,%c,%c\n",a,b,a,b);}10、下列程序的运行结果是_____

main(

)

{char

c1='a',c2='b',c3='c',c4='\101',c5='\116';

printf("a%cb%c\tc%c\tabc\n",c1,c2,c3);

printf("\t\b%c%c",c4,c5);}11、下列程序的运行结果是_______main(

)

{int

b=65536;

printf("%d",b);

}12、下列程序的运行结果是_____________

main(

)

{inti,j,m,n;

i=8;j=10;

m=++i;

n=j++;

printf("%d,%d,%d,%d\n",i,j,m,n);

}总结:本项目主要介绍了数据的基本类型,常量和变量的定义,使用方法,数据类型的转换等内容,这也是C语言程序的基本要素,为后期学习C编程打下基础。

第3讲运算符的种类很丰富,可分为以下几类:1、算术运算符用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)自减(--)共七种。2、关系运算符用于比较运算。包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)六种。3、逻辑运算符用于逻辑运算。包括与(&&)、或(||)、非(!)三种。4、位操作运算符参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。5、赋值运算符用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。6、条件运算符这是一个三目运算符,用于条件求值(?:)。7、逗号运算符用于把若干表达式组合成一个表达式(,)。8、指针运算符用于取内容(*)和取地址(&)二种运算。9、求字节数运算符用于计算数据类型所占的字节数(sizeof)。10、特殊运算符有括号(),下标[],成员(→,.)等几种。一、算术运算符算术运算符包括基本算术运算符和自增、自减运算符,其中基本算术运算符简称算术运算符。1、基本算术运算符基本算术运算符的运算对象、运算规则与结果、结合性如表所示:两个单目运算符都是出现在运算对象的前面。例如+5的结果是正整数5,-5的结果是负整数5。双目运算符中的加(+)、减(-)、乘(*)运算和普通算术运算中加法、减法和乘法相同。双目运算符除(/)与运算对象的数据类型有关。两个整数相除结果为整数,例如7/3的结果为2,舍弃小数部分。若两个运算对象中有一个或两个都是实型,则运算结果为实型。双目运算符模(%)的运算对象必须为整型数据,结果是整除后的余数。运算结果的符号如何确定,在不同的系统中是不同的,在TurboC中运算结果的符号与被除数相同。例如7%3、7%-3的结果均为1(商分别为2、-2);-7%3、-7%-3的结果均为-1(商分别为-2、2)。2、算术表达式用算术运算符和括号将运算对象连接起来的,符合C语法规则的式子,称算术表达式。例如:15/2-8%5*1.0是一个合法的算术运算表达式。在计算机语言中,算术表达值规律与数学中的四则运算的规律类似。在对它进行运算时,首先分清楚哪些运算符先运算,哪些运算符后运算,即按优先级由高到低运算;当优先级相同时再按其结合性来运算。上式中/、%、*运算符相同,均高于减(-)运算符,它们的结合性均为从左到右。(1)在C语言中,所有实型的运算都以双精度方式进行的。若是单精度数,则在尾数部分补0,使之转化为双精度数。(2)双目运算符两侧运算数的类型必须一致,才能进行操作,所得结果的类型与运算数的类型一致。例如1.0/2.0,其运算结果为0.5;而1/2其运算结果为0。(3)如果一个运算符两则的数据类型不同,系统则会自动进行类型转换,使两者具有同一种类型,然后进行运算。当然也可以人为进行数据类型的强制转换,其格式如下:(数据类型符)(表达式)其功能是将“表达式”的值转换成“数据类型符”所表示的数据类型。对强制类型转换应注意以下几点:(1)若表达式仅是单个常量或变量,则常量或变量不必用圆括号括起来;若是含有运算符的表达式,则必须加圆括号。例如:(float)n

/*表示将表达式n的值转换float类型*/(int)n+m

/*表示将n的值转换成int型后再与m进行相加运算*/(int)(n+m)/*表示先对n和m进行加运算,再将运算结果转换成int型*/(2)参与运算的常量或变量的类型自动转换是临时的,它仅产生一个临时的、类型不同的数据参加运算,其常量或变量的原类型和值均不改变。(3)类型转换将占用系统时间,过多的转换将降低程序的运行效率。在设计程序时应尽量选择好数据类型,以减少不必要的类型转换。【例1】算术运算符应用举例。

main(

)

{

inta=5,b=8,c;

float

f=15.78;c=(int)f-a%b;

printf("c=%d\n",c);

printf("f=%f\n",f);

}运算结果:c=10f=15.780000f变量的类型仍为float型,数值大小仍为15.783、自增、自减运算符自增(++)、自减(--)运算符的作用是分别使变量值自增1和自减1,均为单目运算符。自增、自减运算既可以放在运算对象的前面(称前辍),也可以放在运算对象的后面(称后辍),前辍和后辍的功能略有不同。自增、自减运算符和运算对象可组成的表达式如下:++x

/*先使x的值增加1,然后再使用增加了值后的x*/--x

/*先使x的值减小1,然后再使用减小了值后的x*/x++

/*先使用x,然后再使x的值增加1*/x--

/*先使用x,然后再使x的值减小1*/x++,++x(或x--,--x)均可以使x的值增加1(或减小1),相当于x=x+1(或x=x-1)。但x++和++x有不同之处。例如,设x初值为5,则下列语句m的值是不同的:m=x++;/*表示将x的值5赋给m后,x再加1变为6*/m=++x;/*表示x的值先加1后变成6,再将新值6赋给m*通过上述我们可以看到,对于x++和++x,当它们出现在其它表达中时,要特别注意它们的运算规则,否则将会得到错误的结果。对于++、--运算符,我们应注意以下几点:(1)++、--运算符只能用于变量,而不能用于常量或表达式,例如8++,(x+y)--均是不合法的。(2)++、--运算符是单目运算符,优先级高于双目基本算术运算符,而低于括号()运算符,结合性为从右到左。(3)++、--运算符的运算对象为字符型、整型、指针型变量或数组元素,运算结果的数据类型同运算对象的类型一致。(4)当出现难以区分的若干个“+”或“-”组成运算符串时,C语言规定:从左到右取尽可能多的符号组成运算符。例如,设整型变量a、b的值均为5,则:a+++b;应理解为(a++)+b,结果为10,运算后a为6,b不变。ab;应理解为(a--)-b,结果为0,运算后a为4,b不变。(5)在printf(

)函数中,实参数的求值顺序,各系统不一样。在多数系统中对函数的求值顺序是从右到左。例如,i初值为5。printf("%d,%d",i,i++);输出结果为:6,5(6)不要在一个表达式中对同一个变量进行多次诸如i++或++i等运算。例如:(a++)+(a++)+(a++);有的系统按照从左到右顺序求解括弧内的运算,求完第一个括弧的值后,实现a的自加,a值变为6,再依次求第二个、第三个括弧的值,结果表达式相当于5+6+7,即18。而另一些系统(如Turboc)把5作为表达式中所有a的值,因此3个a相加,得表达式的值为15,在求出整个表达式的值后再实现自加3次,a的值变为8。不同的编译系统对这样的表达式将作不同的处理,因而得到的结果也各不相同。应该避免出现这种有歧义、可读性差的语句,程序中尽量不要出现这种现象。【例2】自增、自减运算的应用。

main(

)

{

inti,j;i=3;

printf("j=%d\n",j=i++);

printf("i=%d\n",i);printf("j=%d\n",j=++i);

printf("i=%d",i);

}运行结果:j=3i=4j=5i=5二、赋值运算在C程序中,要将某个值赋给一个变量,通常用到赋值运算符。1、赋值运算符赋值符号“=”就是赋值运算符,基功能是将一个数据赋给一个变量。例如“a=5”、“x=y+z”都能进行赋值运算,可将一个常量或一个表达式的值赋给一个变量。赋值运算符的左侧必须是变量,右侧为一个表达式。赋值运算符(=)不等于数学中的“等号”,这里不是等同的关系,而是进行“赋值”操作。赋值运算符的结合性是从右到左。赋值运算符的优先级如下(优先级逐渐降低):算术运算符→关系运算符→双目逻辑运算符→赋值运算符在做赋值运算时,尽量做到赋值号两侧的数据类型一致,若不一致,则赋值时会自动进行类型转换。但这种转换与前面讲的转换不相同,此处所讲的转换是将赋值运算符右侧表达式的值转换成与左侧变量相同的类型。在C语言的赋值表达式中,转换的原则是:(1)将实型数据赋给整型变量时,舍弃实数的小数部分。例如I为整型变量,执行“i=5.78”的结果是使i的值为5。(2)将整型数据赋给实型变量时,数值不变,将以实数形式(在整数后添上小数点及若干个0)存储到变量中。(3)将一个double型数据赋给float变量时,截取其前面7位有效数字,存放到float变量的存储单元中。相反,将一个float型数据赋给double变量时,数值不变,有效数扩展到16位。(4)字符型数据赋给整型变量时,只将字符数据(8位)放到整型变量低8位中,高8位补0或补1有两种情况。①如所用系统将字符处理为无符号的量或对unsignedchar型变量赋值,则高8位补0。例如,将字符‘\376’赋给int型变量,如图(a)所示。②如所用系统(如TurboC)将字符处理为带符号的,则高8位补字符最高位数0或1。如下图(b)所示。(5)将一个整型数据赋给一个char型变量时,只将其低8位原封不动地送到char型变量中。如图所示。(6)将unsignedint型数据赋给longint型变量时,只需将高位补0即可。将一个unsignedint型数据赋给一个占字节数相同的整型变量时,只要将unsigned型变量在内存中的内容原样送入非unsigned型变量的内存中。(7)将带符号的int型数据赋给long型变量时,只将int型数据放入long型变量的低字节中,高字节全部补int数据型的符号位。总之,不同类型的整型数据间的赋值均按存储单元中的存储形式直接传送。由于C语言使用灵活,在不同类型数据间赋值时,常常会出现意想不到的结果,而编译系统并不提示出错,全靠程序员人为来找出问题。【例3】将无符号数据赋给有符号变量的应用。

main()

{

unsigned

a=65535;

int

b;

b=a;

printf("%d\n",b);}运行结果:-1程序分析:因为unsigned型变量a的值为65535,它在内存中是以16个“1”存放的。当将a的值赋给int型变量b时,只需将a内存中内容原样复制到b内存中。考虑到b为有符号型,内存中最高位是“1”认为是负数,是以补码形式存放的。在用“%d”形式输出b值,要将补码形式转换成原码后再输出,所以输出2、复合式赋值运算符C语言中提供了另一种赋值运算符,例如:+=、-=、*=、/=、%=都是复合式赋值运算符。它们把算术运算和赋值运算两者结合在一起作为一个复合运算符,以达到简化书写程序和提高运算效率的目的。例如,可以有:a+=b+c

等价于a=a+(b+c)a-=b+c

等价于a=a-(b+c)a*=b+c

等价于a=a*(b+c)a/=b+c

等价于a=a/(b+c)a%=b+c

等价于a=a%(b+c)当然,如果上述五个运算符的右侧是一个变量或一个常量,在将转换成基本的赋值符形式时,就可以不加括弧。例如:a%=b

可写成a=a%(b)或a=a%b。凡是双目运算符,都可以与赋值运算符一起合成复合式赋值运算符。C语言规定除了可以使用以上五种外,还可以使用下面五种(将在后面章节中介绍):<<=、>>=、&=、|=、^=算术自反赋值运算符在书写时,两个运算符间不能有空格。算术自反赋值运算符和赋值运算符是同级别的,结合性是从右到左。3、赋值表达式由赋值运算符或自反赋值运算符(复合赋值运算符)将一个变量和一个表达式连接起来的式子称为赋值表达式。具体构成规则一般形式如下:变量

赋值运算符

表达式。其运算过程是:先计算表达式的值,然后将该值赋给左侧变量,整个赋值表达式的值就等于左侧变量的值。例如“a=5+3”,先计算表达式“5+3”的值为8,然后将此值8赋给左侧变量a,整个表达式的值也为8。对赋值表达式有几点说明:(1)上述一般形式的赋值表达式中的“表达式”可以是算术表达式、赋值表达式等,当然也可以是一个常量或一个变量,例如,a=b=c=10。由于赋值运算符的结合性为从右到左,因此,这个表达式等价于a=(b=(c=10))。经过连续赋值后,a,b,c的值都是10,但最后表达式值是a的值为10。(2)赋值表达式也可以包含复合赋值运算符。例如:a+=a-=a*a;也是一个赋值表达式。如果a初值为5,此赋值表达式的求解步骤如下:先进行“a-=a*a”的运算,它相当于a=a-(a*a)=5-(5*5)=5-25=-20。再进行“a+=-20”的运算,它相当于a=a+(-20)=-20-20=-40。(3)赋值表达式在C程序中使用相当灵活,它可以出现在其它语句中,例如:printf("%d",a=b);在这一个语句中完成了赋值和输出双重功能。(4)在赋值表达式x=x中,虽然赋值运算符两侧均为x,但含义不同。赋值运算符右侧的x表示变量x所代表的存储单元中的值,左侧的x表示以x为标识的存储单元。对于n=n+1是合法的赋值表达式,其作用是取变量n中的值加1后再放入变量n中,即使变量n中的值增加1。(5)用赋值运算符可以实现两个变量值的互换。例如要交换变量a,b的值,可用:t=a;a=b;b=t;(通过中间单元实现)a=a+b;b=a-b;a=a-b;(a,b最好为同一类型的整型或字型)(6)在赋值表达式后加一分号(;)就成了语句。赋值语句和赋值表达式是不同的,赋值表达式是一种表达式,它可以出现在任何允许表达式出现的地方。作业:1、下列数据中属于字符串常量的是

。A.ABC

B.'ABC'

C."abc"

D.'a'2、下列数据中属于字符常量的是

。A."A"

B.'\\'

C.w

D.''3、在C语言中,下列哪个是合法的实型常量

。A.378e

B.

E-2

C.

1.3145e2

D.2684、下列不合法的变量名为(

)。 A.int

B.int1

C.name_1

D.name05、在C语言中,char型数据在内存中的存储形式是

A.BCD码

B.ASCII代码值C.内码值

D.十进制代码值6、执行语句“x=(a=5,b=a--);”后,整型变量x,a,b的值依次为

A.5,4,4

B.5,4,5

C.5,5,4

D.4,5,47、表达式“25%3/2”值为

A.0

B.0.5

C.2

D.1小结本节主要讲解了算术运算符及算术表达式,赋值运算符和赋值表达式,并通过案例加深理解。

第4讲上节课讲解了算术运算符和赋值运算符(回顾),本节主要讲关系运算符,逻辑运算符以及位运算等。一、逻辑运算包括:1。&&逻辑与2。||逻辑或3。!逻辑非逻辑运算符用于对包含关系运算符的表达式进行合并或取非对于使用逻辑运算符的表达式,返回0表示“假”,返回1表示“真”。关于逻辑运算符的解释请注意:任何使用两个字符做符号的运算符,两字符之间不应有空格,即将==写成==是错误的。假设一个程序在同时满足条件a<10和b==7时,必须执行某些操作。应使用关系运算符和逻辑运算符“与”来写这个条件的代码。用&&表示“与”运算符,该条件代码如下:(a<10)&&(b==7);类似地,“或”是用于检查两个条件中是否有一个为真的运算符。它由两个连续的管道符号(||)表示。如果上例改为:如果任一语句为真,则程序需执行某些操作,则条件代码如下:(a<10)||(b==7);第三个逻辑运算符“非”用一个感叹号(!)表示。这个运算符对表达式的真值取反。例如,如果变量s小于10,程序程序需执行某些操作,则条件代码如下:(s<10)或(!(s>=10))//s不大于等于10关系运算符和逻辑运算符的优先级一般都低于算术运算符。例如,5>4+3的计算与5>(4+3)运算符是一样的,即先计算4+3,再执行关系运算。此表达示的结果为“假”,即,将返回0。下面的语句printf("%d",5>4+3);将输出0可以总结为:&&的结果是真真为真。||的结果是假假为假。二、位运算符包括:1。&位与符2。|位或符3。^位异或符4。~位取反符以操作数12为例。位运算符将数字12视为1100。位运算符将操作数视为位而不是数值。数值可以是任意进制的:十进制、八进制或十六进制。位运算符则将操作数转化为二进制,并相应地返回1或0。位运算符将数字视为二进制值,并按位进行相应运算,运算完成后再重新转换为数字。例如:表达式10&15表示(1010&1111),它将返回表示1010的值10。因为真真得真,或者是11得1,同位全是1结果也是1表达式10|15表示(1010|1111),它将返回表示1111的值15。假假得假。全零得零。表达式10^15表示(1010^1111),它将返回表示0101的值5。此时是同性相斥,相同的就为假。表达式~10表示(~1010),它将返回表示0101的值-11。此号好理解,按位取反三、逗号运算符和逗号表达式逗号运算符(也称顺序求值)用逗号(,)表示,是双目运算符,其运算对象是表达式。逗号表达式就是用逗号把若干个表达式连接起来的式子。例如:3+5,6+9。逗号表达式的一般形式为:表达式1,表达式2,…,表达式n。逗号运算符的优先级在C语言的所有运算符中最低,结合性是从左到右。逗号表达式中的“表达式”可以是任何表达式,也就是说逗号运算符的运算对象可以是任何类型的表达式。逗号表达式的求解过程是:依次求解表达式1、表达式2、…、表达式n,整个逗号表达式的值等于表达式n的值。例如,表达式:a=3,6*5它相当于(a=3),6*5,在求解过程中使得a的值均为3,整个表达式的值为30。又如表达式:a=2*5,a*4它相当于(a=2*5),a*4,在求解过程中,先求解a=2*5,再求解a*4,使得变量a的值为10,而整个表达式的值为10*4,即为40。其实,逗号表达式无非是把若干个表达式“串联起来”。请注意并不是任何地方出现的逗号都是作为逗号运算符,例如函数参数也是用逗号来间隔。例如:printf("%d,%d%d\n",(a,b,c),b,c);其中“(a,b,c)”为一个逗号表达式,它的值等于c的值;而“(a,b,c),b,c”不是逗号表达式,而是三个参数:“(a,b,c)”、“b”、“c”。C语言的表达式类型相当丰富,这使得C语言表达式能力强,因而C语言使用灵活,适应性强。【实例1】分析以下程序的输出结果。#include<stdio.h>#include<string.h>main(){chars[]="a'\n\\\'\r\b";printf("%d,%d\n",sizeof(s),strlen(s));}程序分析:字符串s由‘a’、‘b’、‘\n’、‘\\’、‘\’‘、’\r‘、’\b‘这7个字符组成,strlen(s)表示字符串长度,故长度为7,但字符串本身有一个结束标志‘\0’,所以,s的长度为7,在内存中占用8个字节。运行结果:8,7【实例2】分析以下程序的输出结果。#include<stdio.h>main(){shortinta=32767,b;b=a+1;printf("a=%d,b=%d\n",a,b);}程序分析:a与b均为短整数,占两个字节.a=32767,a的补码:0111111111111111,b的补码=a的补码+1=0111111111111111+1=10000000000000000,则b的原值=-(1111111111111111+1)=-(10000000000000000)=-32768.运行结果:a=32767,b=-32768【实例3】分析以下程序的输出结果。#include<stdio.h>main(){inta,b,x;x=(a=3,b=a--);printf("x=%d,a=%d,b=%d\n",x,a,b);}程序分析:对于x=(a=3,b=a--);语句,右边是一个逗号表达式。先执行a=3,再执行b=a--,a=2,b=3,返回b即3,x=3。运行结果:x=3,a=2,b=3【实例4】分析以下程序的输出结果。#include<stdio.h>main(){intn=2;n+=n-=n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论