C语言程序设计第二版ppt课件(完整版).ppt
C语言程序设计语言程序设计(第二版)(第二版)第一章第一章 C程序设计初步知识程序设计初步知识本章目录本章目录1.1 简介简介C语言发展史及特点语言发展史及特点 1.2 C语言程序的基本标识符语言程序的基本标识符 1.3 C程序的举例程序的举例1.4 C语言的编译环境语言的编译环境 1.1简介简介C语言发展史及特点语言发展史及特点1C语言的发展史语言的发展史程序设计语言是人与计算机进行信息交流的工具。从1954年第一种高级语言FORTRAN问世后不久,不同风格、不同用途、不同规模、不同版本的程序设计语言风涌而起。在这些语言中,C语言以其高效、灵活、功能丰富,表达力强,移植性好而受青睐。1.1简介简介C语言发展史及特点语言发展史及特点2C语言的特点语言的特点C语言是一种模块化的程序设计语言。结构化程序设计语言,直接支持顺序、分支和循环三种典型的基本结构,是程序设计便于使用“自顶向下逐步求精”的结构化程序设计技术。C语言通常被称为中级语言,这并不意味着C语言的功能不如高级语言,而是因为它把高级语言的先进思想与汇编语言的控制和灵活性有机结合了起来。语言简洁,结构紧凑,使用方便、灵活。运算极其丰富,数据处理能力强。C语言一共有34种运算符。可移植性好。C语言程序基本上可以不作任何修改,就能运行于各种不同型号的计算机和各种操作系统环境上。可以直接调用系统功能,实现对硬件的操作。1.2 C语言程序的基本标识符语言程序的基本标识符任何一种高级语言,都有自己的基本词汇符号和语法规则,程序代码都是由这些基本词汇符号根据该语言规则编写而成,C语言也不例外。C语言规定了其所需要的基本字符集和标识符。1.2 C语言程序的基本标识符语言程序的基本标识符1.字符集在计算机键盘上有的字符都可以作为C语言的有效字符。满足C语言文法要求的字符集如下:1)英文字母az,AZ;2)阿拉伯数字09;3)特殊符号(下表)+_(下划线)#*(.&空格/):;%?“=|1.2 C语言程序的基本标识符语言程序的基本标识符2.标识符C语言的标识符主要用来表示常量、变量、函数和类型的名字,是只起标识作用的一类符号,标识符由数字、下划线或英文字母构成且第一个必须是字母或下划线。它包括如下三个类型:1)关键字所谓关键字,就是这样一类标识符,其每一个都有特定含义,不允许用户把它们作为变量名使用,C语言的关键字都用小写英文字母表示,共有常用的36个关键字,如下表1.2。表1.2C语言的关键字autodefaultfloatlongstaticvoidbreakdoforregisterstructvolatilecasedoublegotorestrictswitchwhilecharelseifreturntypedefconstenuminlineshortunioncontinueexternintsignedunsigned1.2 C语言程序的基本标识符语言程序的基本标识符2)预定义标识符除了上述保留字外,还有一类具有特殊含义的标识符,它们被用作库函数名和预编译命令,这类标识符在c语言中成为预定义标识符。一般来说不要把预定义标识符再定义为其他标识符(用户定义标识符)使用。预定义标识符包括预编译程序命令和c编译系统提供的库函数名。其中预编译程序命令有:defineundefincludeifdefifndefendifline1.2 C语言程序的基本标识符语言程序的基本标识符3)用户定义标识符用户定义标识符也就是名字是用户根据自己的需要定义的一类标识符。用于标识变量名、符号常量名、用户定义函数名、类型名和文件指针名等。这类标识符主要由英文字母、数字和下划线构成,但开头字符一定是字母或下划线,下划线(_)起到字母的作用,它还可用于一个长名字的描述。如有一个变量,名字为checkdiskspace,这样识别起来就比较困难,如果合理使用下划线,把它写成check_disk_space,那么,标识符的可读性就大大增强。1.3 C程序的举例程序的举例例1.1求一个学生英语、数学、语文成绩的平均分的C语言程序。/*功能:求三个数的平均值*/main()/*main()称为主函数*/floata,b,c,ave;/*定义a,b,c,ave为实型数据*/a=7;b=9;c=12;ave=(a+b+c)/3;/*计算平均值*/printf(ave=%fn,ave);/*在屏幕上输出ave的值*/程序运行结果:1.3 C程序的举例程序的举例例1.2要求输入圆半径值,计算圆面积并输出的C语言程序。#include#definePI3.14159main()/*计算圆的面积*/intr;floats;scanf(%d,&r);/*输入圆的半径*/s=PI*r*r;printf(s=%fn,s);/*输出圆的面积的值*/程序运行结果:1.3 C程序的举例程序的举例例1.3比较两个儿童的身高,并输出最高的身高的C语言程序。main()/*主函数*/floatmax(floatx,floaty);/*对要用的函数进行声明*/floatnum1,num2,num3;/*定义num1、num2、max为实型变量*/scanf(%f,%f,&num1,&num2);/*由键盘输入num1、num2的值*/num3=max(num1,num2);printf(max=%fn,num3);/*在屏幕上输出调用max的函数值*/floatmax(floatx,floaty)/*x和y分别取num1和num2传递的值*/if(xy)returnx;/*如果xy,将x的值返回给max*/elsereturny;/*如果xy不成立,将y的值返回给max*/1.3 C程序的举例程序的举例程序运行结果:1.3 C程序的举例程序的举例结合以上示例,可以看出C语言程序结构有以下基本特点:1C语言程序是由函数(如:main函数和max函数)组成的,每一个函数完成相对独立的功能。函数是C语言程序的基本单位。main和max都是函数名,函数名后面的一对圆括号“()”是用来写函数的参数的。参数可以有,也可以没有,但圆括号不能省略。2函数体用“”和“”括起来,分别表示函数的开始和结束。函数体一般包含声明部分和执行部分。3一个C语言程序总是从main()函数开始执行。如果程序中包含多个函数,从main函数中开始执行,程序执行完后在main中结束。1.3 C程序的举例程序的举例4C语言编译系统区分字母大小写。C语言把大小写字母视为两个不同的字符。5C语言规定每条语句或数据说明均以分号(;)结束。分号是语句不可缺少的组成部分。6主函数main()既可以放在max()函数之前,也可以放在max()函数之后。习惯上,将主函数main()放在最前面。7C语言程序中所调用的函数,既可以是由系统提供的库函数,也可以是由设计人员自己根据需要而设计的函数。例如,在例1.2中,printf()函数是C语言编译系统库函数中的一个函数,它的作用是在屏幕上按指定格式输出指定的内容;max()函数是由用户自己设计的函数,它的作用是计算两个数中的较大值。1.4 C语言的编译环境语言的编译环境 TurboC(TC)是一个集源程序编辑、编译、连接、运行和调试于一体,用菜单驱动的集成软件环境,具有使用简单、方便、速度快、高效、功能强等特点。C语言程序员可在TurboC环境下完成所有的工作。运行C语言程序的一般过程1.4 C语言的编译环境语言的编译环境 1)启动TC,进入TC集成环境。2)编辑。如果源程序存在语法错误,则修改源程序中的错误。3)编译。如果编译成功,则可进行下一步操作,否则返回2)修改源程序,再重新编译,直至编译成功。4)连接。如果连接成功,则可进行下一步操作,否则,根据系统的下一步提示,进行相应修改,再重新连接,直至连接成功。5)运行及查看结果。通过观察程序运行结果,验证程序的正确性。如果出现逻辑错误,则必须返回2)修改源程序,再重新编译、连接和运行,直至程序正确6)运行结果若正确,便可退出TC集成环境,结束本次程序运行。1.4 C语言的编译环境语言的编译环境 2.进入TurboC(具体操作方法现场演示)1)启动方式2)主菜单的基本操作3)退出TurboC3.编写源程序4.文件保存在编辑源程序过程中,随时都可以按F2键(或File|Save),将当前编辑的文件存盘,然后继续编辑。这是一个良好的习惯!1.4 C语言的编译环境语言的编译环境 5常用编辑键1)可用Insert键控制工作状态是否为“插入状态”。按下Insert键,可看到屏幕编辑窗口上有“Insert”,这时为插入状态,此时可在屏幕当前光标处插入所要输入的字符。2)在插入状态下,再按一下Insert键可取消插入状态,状态行上的“Insert”标识消失,此时键入的字符将覆盖光标处的字符。3)Delete键将删除光标所在的字符。4)Ctrl+Y键,可删除光标所在的一行。5)Ctrl+N键,可用来插入一行。6编译、连接源程序文件7运行与查看结果1)运行当前正在编辑的源程序文件2)查看运行结果8.建立工作环境本章小结本章小结本章开始介绍了C语言的发展史及其特点。C语言是一门经典的程序设计语言,它的功能丰富、表达能力强、使用灵活、应用面广、目标程序效率高、可移植性好、能对硬件直接进行操作等优点。通过实例介绍了C语言的简单编程,并进行了总结。一个C语言程序是由一个或多个函数所组成。函数包括函数说明和函数体两个部分。在函数定义之外还可以包含一个说明部分,该说明部分叫做外部说明等。详细讲解了上机过程及编译和运行环境。其中包括从编写好一个C程序到完成运行的基本过程。包括启动、编辑、编译、连接、执行和运行查看结果等步骤。TurboC是一个集编辑、编译、连接、执行和调试于一体的语言程序开发系统,使用非常方便。第二章第二章 数据类型、运算符和数据类型、运算符和表达式表达式本章目录本章目录2.1 C2.1 C语言的数据类型语言的数据类型 2.2 2.2 常量常量 2.3 2.3 变量变量2.4 2.4 运算符和表达式运算符和表达式 2.5 2.5 数据类型的转换数据类型的转换 2.1 C语言的数据类型语言的数据类型一个程序应包括数据结构和算法。数据结构是在程序中要指定数据的类型和数据的组织形式。算法是如何对数据结构进行处理达到编程者的目的的想法,由于每个人的想法不一样,所以程序代码有可能不相同,但最后都能达到自己的目的。根据不同的编程语言,程序的概念可以这样表示:程序=算法+数据结构+程序设计方法+语言环境C语言的数据结构是以数据类型形式出现的。C的数据类型如下:构造类型整型int字符型char实型(浮点型)枚举类型enum基本类型空类型void指针类型*单精度型float双精度型double数据类型数组类型结构体类型struct共用体类型union2.2常量常量在程序执行过程中,其值始终保持不变的量称之为常量。常量具有一定的类型,类型由其表示形式决定。在C语言中,常量可以分为整型常量、实型常量、字符型常量、字符串常量、符号常量等。2.2常量常量1.整型常量整型常量整型常量就是整型常数,它是一种从字面即可判断其值的常量。C语言中常量可以用十进制、八进制和十六进制表示。1十进制整数。由数字09组成但第一个数不能为0的整数。如:123,-456,0。2八进制整数。以0开头由07组成的整数。如0123表示八进制数123。3十六进制整数。以0 x开头由数字09和字母af(AF)组成的的数。如0 x123,代表数十六进制的123。整型常量的写法一定要合法,下面各数不合法:078,3a。其中078表示八进制数,但包含了07以外的数8。3a表示十进制数,但包含了09以外的字符a。2.2常量常量2.实型常量实型常量实数又称浮点数,就是日常生活中的带小数点的数。实型常量有两种表示形式:(1)十进进小数形式。它由数字和小数点组成(注意必须有小数点)。如.123、123.、123.0、0.0都是十进制小数形式。其中123.0末尾的数字0可以省略,.123小数点前面的0可以省略,0.0可以省略其中一个0但不能都省略。(2)指数形式。如123e3或123E3都代表123103。但注意字母e(或E)之前必须有数字,且e后面的指数必须有整数,如e3,2.1e3.5,.e3,e等都不是合法的指数形式。一个实数可以有多种指数表示形式。例如123.456可以表示为,12.3456e1,1.23456e2,0.123456e3等。把其中的1.23456e2称为“规范化的指数形式”,即在字母e(或E)之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字。一个实数在用指数形式输出时,是按规范化的指数形式输出的。例如,指定将实数5689.65按指数形式输出,必然输出5.68965e+003。2.2常量常量3.字符型常量字符型常量由字符组成的、其值不能被改变的量称为字符型常量。根据组成结构的不同,字符型常量可分为字符常量、转义字符和字符串常量。1字符常量和转义字符字符常量和转义字符C的字符常量是用单引号()括起来的一个字符。如a,x,D,?,$等都是字符常量。注意,a和A是不同的字符常量。除了以上形式的字符常量外,C还允许用一种特殊形式的字符常量,就是以一个“”开关的字符序列。例如,前面已经遇到过的,在printf函数中的n,它代表一个“换行”符。这是一种“控制字符”,在屏幕上是不能显示的。在程序中也无法用一个一般形式的字符表示,只能采用特殊形式来表示。“”使后跟的一个字符失去了原有的意义,因此又称作转义字符。如,n中的“n”不代表字母n,而作为“回车换行”符处理。转义字符是一种特殊形式的字符常量,主要用以表示控制代码和图形符号。常用的转义字符见下表:2.2常量常量字符形式等价于ASCII码转义字符的意义ax077鸣铃bx088退格,将当前位置移到前一列fX0C12走纸换页nX0A10回车换行rX0D13回车,将当前位置移到本行开头tX099水平制表(跳到下一个tab位置)X5C92反斜杠字符“”X2739单引号字符X2234双引号字符dddddd代表1-3位八进制数所代表的字符xhhhh代表1-2位十六进制数所代表的字符 表中,ddd是用八进制数表示的ASCII码。例如:用八进制数102(相当于十进制数66)代表ASCII字母“B”;用033代表Esc。从ASCII码表中能够查到常用的转义字符。xhh是用十六进制数表示的ASCII码。例如:用x1B同样可以代替Esc。由此可知,用转义字符可以表示任一ASCII码;并且任一ASCII码可以有多种表示方法。2.2常量常量有关字符常量的几点说明:1)单引号本身只作定界符使用,而不是字符常量的一部分。2)因字符“”和“”在字符常量中有特殊用途,因此,他们不能直接作字符常量使用。若要将这两个字符用作字符常量,应写为和,即在这些字符前再加一个反斜杠“”。3)英文字母区分大小写。注意,a和A是不同的字符常量。4)字符常量具有数值,其值对应于ASCII码值,是0-255之间的整数。例如,A的值是65,a为97。因此,字符型常量与整型常量可以混合使用。在不至于引起混淆的情况下,0-255之间的整数可以用字符常量表示。例如,把63写成A-2,反之亦然。5)输出字符常量时的输出格式控制符用%c。2.2常量常量例2.1 字符型常量与整型常量混合使用实例。要求编程输出字符“#”以及其ASCII码值,求a+1的值和输出其ASCII字符,输出整数65以及该数字所对应的ASCII字符。main()printf(%c,%d n,#,#);printf(%c,%d n,a+1,a+1);printf(%c,%d n,65,65);运行结果如下:2.2常量常量2字符串常量字符串常量 字符串常量是一对双引号括起来的字符序列,如,“How do you do.”,“CHINA”,“a”,“$123.45”都是字符串常量。可以直接输出一个字符串。如 printf(“How do you do.”);不要将字符常量与字符串常量混淆。a是字符常量,“a”是字符串常量,二者不同。有人不能理解a和“a”究竟有什么区别?C规定:在每一个字符串的结尾加一个“字符串结束标志”,以便系统据此判断字符串是否结束。C规定以字符0作为字符串结束标志。0是一个ASSCII码为0的字符,从ASSCII代码中可以看到ASSCII码为0字符是“空操作字符”,即它不引起任何控制动作,是一个不可显示的字符。如果有一个字符串“CHINA”,实际上在内存中是 它的长度不是5个字符,而是6个字符,最后一个字符为0。CIHNA02.2常量常量4 符号常量符号常量 在程序设计中,对于某些有特定含义的、经常使用的常量可以用标识符来代替。用标识符代表常量,可增加程序的可读性和可维护性。在C语言中,代表常量的标识符称作符号常量。符号常量在使用之前必须先定义,符号常量定义的一般格式为:#define 标识符 常量 其中#define表示宏定义的一个命令,宏定义必须写在一行上。标识符称为“宏名”,字符串称为“宏体”。其功能是把该标识符定义为其后的常量值。一经定义,在程序中所有出现该标识符的地方均代表该常量值。习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。2.2常量常量例2.2宏定义的使用#define PI 3.14159 /*宏定义命令定义PI 为3.14159*/main()float s,r;/*s,r定义为实型变量用来存放实型数据*/r=5;/*5赋值给r*/s=PI*r*r;printf(s=%fn,s);运行结果为:2.2常量常量 使用符号常量的好处是:(1)含义清楚。如上面的程序中,看程序时从PI就可知道它代表“”。因此定义符号常量名时应考虑“见名知意”。(2)在需要改变一个常量时能做到“一改全改”。在定义符号常量时,应注意以下几点:如果程序中有多个符号常量,必须用多个命令行分别定义。即一行只能定义一个符号常量。#define PI 3.1415926#define TRUE 1符号常量代表的常量可以是前文介绍的各种形式的常量,还可以代表程序的其他语法成分。2.2常量常量例2.3#define P printfmain()char a,b;a=x;b=y;a=a-32;b=b-32;P(%c,%cn%d,%dn,a,b,a,b);运行结果为:这里用P代表了库函数名printf,3)符号常量的定义可以放在程序的任何位置,但必须在使用之前预先定义;因此,一般放在程序的开始位置。2.3变量变量在程序运行过程中,其值可以改变的量称为变量。一个变量 必须有一个名字即变量名,变量名要遵守标识符的命名规则。变量名在内存中占据一定的存储单元。在该存储单元中存放变量的值。下面各节分别介绍整型、实型(浮点型)、字符型变量。2.3变量变量1.整型变量整型变量1整型变量的分类整型变量的用来存放整型常量的。根据数值的范围将变量定义为基本整型、短整型或长整型。分别表示:1)基本整型,以int表示。2)短整型,以shortint表示,或以short表示。3)长整型,以longint表示,或以long表示。在TurboC中一个int型的变量值的范围-215(215-1),即-3276832767。可以将变量定义为“无符号”和“有符号”类型,即加上修饰符unsigned和修饰符signed。如果既不指定为signed,也不指定为unsigned,则隐含为有符号(signed)。归纳起来,可以用以下6种整型变量。即:有符号基本整型signedint无符号基本整型unsignedint有符号短整型signedshortint无符号短整型unsignedshortint有符号长整型signedlongint无符号长整型unsignedlongint2.3变量变量 标准没有具体规定以上各类数据所占内存字节数,只要求long型数据长度不短于int型,short型不长于int型。具体如何实现,由各计算机系统自行决定。TurboC系统对各类数据分配如下:数据类型所占字节数(个)所占位数(bit)int216short 216long 432unsignedint 216unsignedshort 216unsignedlong 432表2.2数据类型 一个unsignedint型的变量值的范围065535。在计算机内整形数据占2个字节。以2为例,把2转化为二进制之后,它的存储形式为:00000000000000102.3变量变量2.整型变量的定义C规定在程序中所以用到的变量都必须在程序中先定义后使用,即“强制类型定义”。每个变量必须要有确定的类型。整型变量定义的一般形式:整型数据类型名变量名;例如:inta,b;(指定变量a、b为整形)unsignedshortc,d;(指定变量c、d为无符号短整型)longe,f;(指定变量e,f为长整型)对变量的定义,一般是放在一个函数的开头部分的声明部分(也可以放在函数中某一分程序内,但作用域只限它所在的分程序)。C语言允许在一个定义中定义多个变量,变量之间用逗号隔开。变量定义之后,编译系统就会为其分配相应的存储空间。2.3变量变量例2.4整型变量的定义与使用。main()inta,b;/*定义a,b为基本整型变量*/unsignedu;/*定义u为无符号整型变量*/a=12;u=10;b=a+u;printf(a+u=%dn,b);运行结果为:可以看到不同种类的整型数据可以进行算术运算。在本例中是int型数据与unsignedint型数据进行相加相减运算。2.3变量变量3整型号数据的溢出 在TurboC中一个int型变量的最大允许值为32767,如果再加1,会出现什么情况?例2.5 整型数据的溢出。main()inta,b;a=32767;b=a+1;printf(“%d,%d”,a,b);运行结果为:2.3变量变量2.实型变量实型变量 1实型变量的分类C语言中实型变量用来存放实型常量的。实型变量分为单精度(float型)、双精度(double型)和长双精度型(longdouble)。数据类型所占字节数(个)所占位数(bit)有效位数float43267double8641516表2.32实型变量的定义对每一个实型变量都应在使用前必须先定义。实型变量定义的一般形式:实型数据类型名 变量名;例如float x,y,(指定x,y为单精度实数)double z;(指定z为双精度实数)2.3变量变量3实型数据的使用 由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的,在有效位以外的数字将被舍去。由此可能会产生一些误差。例2.6 实型数据的舍入误差。main()float a,b;a=123456.789e5;b=a+20;printf(a=%fnb=%f,a,b);运行结果为:2.3变量变量程序内printf函数中的“%f”是输出一个实数时的格式符。程序运行时,输出b的值与a相等。原因是:a的值比20大很多,a+20的理论值应是12345678920,而一个实型变量只能保证的有效数字是7位有效数字,后面的数字是无意义的,并不准确地表示该数。运行程序得到的a和b的值是12345678848.000000,可以看到,前8位是准确的,后几位是不准确的,把20加到后几位上,是无意义的。应当避免将一个很大的数和一个很小的数直接相加或相减,否则就会“丢失”小的数。如果想得到预期效果,读者可以把float改为double类型。与此类似问题有很多,读者编程时应当注意。2.3变量变量3.字符型变量字符型变量 1字符型变量的分类字符型变量用来存放字符常量,C语言的字符型变量分为有符号型(char)变量和无符号型(unsignedchar)变量。数据类型所占字节数(个)所占位数(bit)取值范围有效位数char18-12812867unsignedchar18025515162字符变量的定义 用到字符型变量时必须先定义。请注意字符型变量在内存中占用1个字节的存储空间,只能放一个字符,不要以为在一个字符变量中可以放一个字符串(包括若干字符)。定义的一般形式:字符型数据类型名 变量名char c1,c2;其中c1和c2为字符型变量,各可以放一个字符。2.3变量变量3字符型变量的使用例2.7:向字符变量赋以整数。main()charc1,c2;c1=65;c2=97;printf(c1=%cc2=%cn,c1,c2);printf(c1=%dc2=%dn,c1,c2);运行结果:2.3变量变量定义c1,c2为字符变量。但在第3和第4行中,将整数65和97分别赋给c1和c2,它的作用相当于以下两个赋值语句:c1=A;c2=a;因为A和a的ASCII码为65和97。在程序的第3和第4行是把65和97两个整数直接存放到c1和c2手内存单元中。“%c”是输出字符时必须使用的格式符。可以看到:字符型数据和整型数据是通用的。它们既可以用字符格式输出(用%c),也可以用整数形式输出(用%d)。但应注意字符数据只占一个字节,它只能存放0255或-128128范围内的整数。2.3变量变量例2.8:大小写字母的转换。main()charc1,c2;c1=a;c2=b;c1=c1-32;c2=c2-32;printf(%c%c,c1,c2);运行结果为:2.3变量变量所有用到的变量“先定义,后使用”。这样做的目的是:1凡未被事先定义的,不作为变量名,这就能保证程序中变量名使用得正确。例如,如果在定义部分写了intabc;而在执行语句中错写成acb。如:acb=30;在编译时检查出acb未经定义,不作为变量名。因此输出“变量acb未经声明”的信息,便于用户发现错误,避免变量名使用时出错。2每一个变量被指定为一确定类型,在编译时就能为其分配相应的存储单元。如指定a、b为int型,TurboC编译系统为a和b各分配两个字节,并按整数方式存储数据。3指定每一变量属于一个类型,这就便于在编译时,据此检查该变量所进行的运算是否合法。例如,整型变量a和b,可以进行求余运算:a%b%是“求余”,得到a/b的余数。如果将a、b的指定为实型变量,则不允许进行“求余”运算,在编译时会给出有关“出错信息”。2.3变量变量4.变量赋初值变量赋初值程序中常需要对一些变量赋初值。赋初值的方式如下:1语言允许在定义变量的同时使变量初始化。如:inta=3:/*指定a为整型变量,初值为3*/floatf=3.56;/*指定f为实型变量,初值为3.56*/charc=a;/*指定c为字符型变量,初值为a*/2也可以使被定义的变量的一部分赋初值。如inta,b,c=5;表示指定a、b、c为整型变量,只对c初始化,c的值为5。3对于几个变量同时赋初值。如inta=3,b=3,c=3;表示a、b、c的初值都是3。不能写成:inta=b=c=3;初始化不是在编译阶段完成的,而是在程序运行时执行本函数时赋予初值的。2.4运算符和表达式运算符和表达式C语言中运算符和表达式数量很多。丰富的运算符和表达式使C语言功能十分完善。这也是语言的主要特点之一。C语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是自左向右进行运算还是自右向左进行运算。这种结合性是其它高级语言的运算符所没有的,因此也增加了C语言的复杂性。2.4运算符和表达式运算符和表达式1.算术运算符和算术表达式算术运算符和算术表达式 1C语言提供了丰富的算术运算符,能够参与各种复杂的运算,基本的算术运算符有如下:1)+加法运算符,双目运算符,即应有两个量参与加法运算。如a+b,4+8等。自左至右结合性。也可以表示取正值运算符,属于单目运算符,自右至左结合性。2)-减法运算符,双目运算符。也可以表示取负值运算符,属于单目运算,如-x,-5等,自右至左结合性。3)*乘法运算符,双目运算符,自左至右结合性。4)/除法运算符,双目运算符,自左至右结合性。参与运算量均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型。2.4运算符和表达式运算符和表达式例2.9main()int a=15,b=2,c;c=a/b;printf(%d,c);运行结果为:参与运算量均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型。2.4运算符和表达式运算符和表达式 5)%求余运算符(模运算符),双目运算符,自左至右结合性。要求参与运算的量必须为整型。求余运算的结果是两数相除后的余数。如100%3的结果1。1.5%2是非法的。6)算术运算符中的运算符和数学中的使用是一样的,先乘、除和求余后加减。2算术表达式 算术表达式是由算术运算符和括号连接起来的式子,运算对象可以是常量、变量和函数等。算术表达式的值可以是整型或实型。以下是算术表达式的例子:a+b,(a*2)c,(x+r)*8-(a+b)7,sin(x)+sin(y)其中sin(x)是求解正弦函数,应用sin(x)时应在程序的开始部分加上#include“math.h”在C语言中使用算术运算符注意的问题:1)算术表达式中的*不能省略。如求三角形的面积公式s=ab/2;在C语言中写成:s=a*b/2 2)算术表达式中只能出现C语言中允许使用的运算字符。如数学面积公式式r2 中的,在C语言中没有这个字符,我们可以通过宏定义的方法实现。3)算术表达式中只能通过()来改变运算对象的运算顺序。2.4运算符和表达式运算符和表达式 2.自增,自减运算符自增,自减运算符+自增1的运算符,其功能是使变量的值自增1。-自减1的运算符,其功能是使变量的值自减1。自增1,自减1运算符均属于单目运算,都具有右结合性。可有以下几种形式:1+i i自增1后再参与其它运算。2-i i自减1后再参与其它运算。3i+i参与运算后,i的值再自增1。4i-i参与运算后,i的值再自减1。在理解和使用上容易出错的是i+和i-。特别是当它们出在较复杂的表达式或语句中时,常常难于弄清,因此应仔细分析。2.4运算符和表达式运算符和表达式例2.10main()int i=4,a,b,c,d;a=i+;b=+i;c=i-;d=-i;printf(a=%dnb=%dnc=%dnd=%d,a,b,c,d);运算结果:2.4运算符和表达式运算符和表达式例2.11main()int i=4;printf(“%dn%dn%dn%d”,+i,i+,-i,i-);运行结果:两个例子中的区别在于printf函数,在C语言中printf函数的参数应从后向前运算即现算i-,-i,i+,+i。读者可以上机运行体会。2.4运算符和表达式运算符和表达式 3.赋值运算符和赋值表达式赋值运算符和赋值表达式 1 赋值运算符 1)简单赋值运算符“=”在C语言中,“=”称为赋值运算符。它的作用是将一个数据赋给一个变量,与数学中的等号不同,它的结合性是自右至左的。优先级仅高于逗号运算符。2)复合赋值运算符 C语言中提供了+=,-=,*=,=,%=,=,&=,=,|=等复合运算符。在赋值符“=”之前加上其它二目运算符。2.4运算符和表达式运算符和表达式 3.赋值运算符和赋值表达式赋值运算符和赋值表达式2赋值表达式 由赋值运算符将变量和表达式连接起来的式子称为赋值表达式。1)简单赋值表达式一般形式为:变量=表达式 例如:x=a+b w=sin(a)+sin(b)y=i+赋值表达式的功能是计算表达式的值再赋予左边的变量。a=b=c=5 可理解为 a=(b=(c=5)2.4运算符和表达式运算符和表达式2)复合赋值表达式一般形式为:变量 双目运算符=表达式例如a+=5 等价于a=a+5x*=y+7 等价于x=x*(y+7)r%=p 等价于r=r%p在C中,凡是表达式可以出现的地方均可出现赋值表达式。例如,式子x=(a=5)+(b=8)是合法的。它的意义是把5赋予a,8赋予b,再把a,b相加,和赋予x,故x应等于13。在C语言中也可以组成赋值语句,按照C语言规定,任何表达式在其末尾加上分号就构成为语句。因此如x=8;a=b=c=5;都是赋值语句,在前面各例中我们已大量使用过了。2.4运算符和表达式运算符和表达式3赋值运算的类型转换如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型。具体规定如下:1)实型赋予整型,舍去小数部分。2)整型赋予实型,数值不变,但将以浮点形式存放,即增加小数部分(小数部分的值为0)。3)字符型赋予整型,由于字符型为一个字节,而整型为二个字节,故将字符的ASCII码值放到整型量的低八位中,高八位为0。4)整型赋予字符型,只把低八位赋予字符量。总之,不同整型数据间的赋值归根到底是按照存储单元的存储形式直接赋给。2.4运算符和表达式运算符和表达式例2.12main()int a,b=65;float x,y=8.88;char c1=k,c2;a=y;x=b;printf(%d,%fn,a,x);a=c1;c2=b;printf(%d,%c,a,c2);运行结果为:2.4运算符和表达式运算符和表达式 本例说明了赋值运算中的类型转换规则。a为整型变量,被赋予实型量y值8.88后,舍去小数部分只取整数8。x为实型变量,被赋予整型量b值65,后增加了小数部分。字符型变量c1的值赋予整型变量a(直接把c1的一个字节放到了变量a的低字节中,高字节补0),整型变量b赋予字符型变量c2,是整型变量b的低八位赋给字符型变量c2(b的低八位为01000001,即十进制65,按ASCII码对应于字符A)。2.4运算符和表达式运算符和表达式 4.逗号运算符和逗号表达式逗号运算符和逗号表达式 1逗号运算符 C语言中逗号“,”是一种运算符,称为逗号运算符。2逗号表达式 逗号表达式是把两个表达式连接起来组成一个表达式。一般形式为:表达式1,表达式2表达式n 逗号表达式的结合方向是自左至右的,先求解表达式1,然后求解表达式2最后求解表达式n的值,最后最后求解表达式n的值作为整个逗号表达式的值。例2.13 main()int a=2,b=4,c=6,x,y;y=(x=a+b),(b+c);printf(y=%d,x=%d,y,x);运行结果为:2.4运算符和表达式运算符和表达式 本例中,(x=a+b),(b+c)是一个逗号表达式,y的值是整个逗号表达式的值,也就是表达式(b+c)的值,x是第一个表达式的值。对于逗号表达式还要说明几点:1)程序中使用逗号表达式,要分别求逗号表达式内各表达式的值2)并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明中,函数参数表中逗号只是用作各变量之间的间隔符。3)在本章中逗号运算符的优先级最低,其次赋值运算符,最高是算术运算符。2.4运算符和表达式运算符和表达式 5.条件运算符条件运算符1条件运算符 C语言中把“?:”称作条件运算符。条件运算符要求有三个操作对象,是C语言中唯一的三目运算符,它连接三个运算分量。2条件表达式 一般形式如下:表达式1?表达式2:表达式3 它的执行过程是:先计算表达式1,如果其值为真,则求解表达式2的值,并作为结果值,否则求解表达式3的值作为结果值。例如:max=(ab)?a:b;该语句执行时,当ab条件成立,变量max取a值,否则取b值。2.4运算符和表达式运算符和表达式例2.14 main()int a,b;a=2;b=3;printf(%d,(ab)?a:b);运算结果:条件运算符的优先级较低,只高于赋值运算符和逗号运算符。2.4运算符和表达式运算符和表达式 6长度运算符长度运算符 C语言中sizeof()称作长度运算符。它是单目运算符。主要用于计算变量或数据类型所占的内存字节数的大小。一般形式:1sizeof(数据类型名)计算数据类型在内存中的所占的字节数 2sizeof(变量名)计算变量在内存中的所占的字节数例2.15main()int a;float b;printf(“%d,%d,%d,%d,%d”,siz