1、C语言概述1本章导读本章导读 主要介绍主要介绍:C语言的发展历史、基本特点和简语言的发展历史、基本特点和简单的单的C语言程序结构与组成语言程序结构与组成;重点介绍重点介绍:算法的含义与算法的描述工具,以算法的含义与算法的描述工具,以传统流程图为重点分析了算法的描述方法。传统流程图为重点分析了算法的描述方法。目目 标标:了解了解C语言的形成、发展和基本特语言的形成、发展和基本特点;了解程序、程序设计、高级语言的概念;掌点;了解程序、程序设计、高级语言的概念;掌握握C语言程序的基本结构和组成;掌握计算机算语言程序的基本结构和组成;掌握计算机算法的基本概念和算法描述的基本工具;运用传统法的基本概念和
2、算法描述的基本工具;运用传统流程图描述一个具体的算法。流程图描述一个具体的算法。1.1 C语言概况语言概况 1960年ALGOL60语言(一种面向问题的高级语言)1963年英国剑桥大学推出CPL语言,同年剑桥大学的马丁理查德对其简化,提出BCPL语言1970年美国贝尔实验室的肯汤姆逊进一步简化,提出了B语言(取BCPL的第一个字母)1972年美国贝尔实验室的布朗W卡尼汉和丹尼斯M利奇对其完善和扩充,提出了C语言(取BCPL的第二个字母)1987年美国标准化协会制定了C语言标准“ANSI C”,即现在流行的C语言1.1.1 C语言的发展1.1.2 C语言的特点(1)C语言是具有低级语言功能的高级
3、语言 C语言既具有高级语言的功能,又具有低级语言的许多功能。它把高级语言的基本结构和语句与低级语言的实用性结合起来,是处于汇编语言和高级语言之间的一种程序设计语言,也可称其为“中级语言”。(2)C语言简洁、紧凑,使用方便、灵活 C语言一共只有32个关键词,9种控制语句,Turbo C 2.0增加了11个关键词(用于各种增强和扩展功能)。程序书写形式自由,主要用小写字母表示,相对于其他高级语言源程序短。(3)运算符丰富,表达式能力强 C语言共有34种运算符,范围广泛,除一般高级语言所使用的算术、关系和逻辑运算符外,还可以实现以二进制位为单位的运算,并且具有如a+,-b等单项运算符和+=、-=、*
4、=、/=等复合运算符等。(4)数据结构丰富,便于数据的描述与存储 C语言具有丰富的数据结构,其数据类型有整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等,因此能实现复杂的数据结构的运算。1.1.2 C语言的特点(5)C语言是结构化、模块化的编程语言 程序的逻辑结构可以使用顺序、分支和循环3种基本结构组成。C语言程序采用函数结构,十分便于把整体程序分割成若干相对独立的功能模块,并且为程序模块间的相互调用以及数据传递提供了便利。(6)C语言程序中,可使用宏定义编译预处理命令、条件编译预处理命令,为编程提供了方便1.1.2 C语言的特点(7)可移植性好 与汇编语言相比,C程序基本上不
5、作修改就可以运行于各种型号的计算机和各种操作系统。(8)C语言也存在一些不足之处 例如运算符及其优先级过多、语法定义不严格等,对于初学者有一定的困难。由于C语言具有上述特点,因此C语言得到了迅速推广,成为人们编写大型软件的首选语言之一。许多原来用汇编语言处理的问题可以用C语言来处理了。1.1.2 C语言的特点1.2 简单的简单的C语言程序语言程序【例【例1.1】在计算机屏幕上输出在计算机屏幕上输出“Hello,World!”/*EX1-1.C */main()printf(Hello,World!n);/*EX1-2.C */main()int r;float l,s;r=5;l=2*3.14
6、159*r;s=3.14159*r*r;printf(r=%d,l=%f,s=%fn,r,l,s);【例1.2】己知圆的半径,求圆的周长和面积/*EX1-3.C */#include stdio.hmain()int x,y,z;scanf(%d,%d,&x,&y);z=area(x,y);printf(area is%dn,z);int area(int a,int b)int c;c=a*b;return(c);【例1.3】输入矩形的两个边长,求矩形的面积(1)C程序由函数组成 每个C程序有且仅有一个主函数main。一个C程序由一个main函数和若干个子函数构成。(2)函数可分为两部分:函
7、数说明和函数体 函数说明的形式:函数类型 函数名(形式参数1类型 形式参数1,形式参数2类型 形式参数2,)函数体的形式:变量定义(说明)部分 函数执行部分 总 结(3)书写格式.C程序的书写格式自由。一行内可以写几条语句,一条语句也可以写在多行上,每条语句后必须以“;”作为语句的结束。复合语句要以一对括起来。(4)执行过程.C程序的执行总是从主函数开始,并在主函数中结束.主函数的位置在程序中是任意的,其他函数总是通过函数调用语句来执行。总 结(5)函数调用.主函数可以调用任何函数,任何非主函数之间都可以相互调用,但是不能调用主函数。(6)输入输出.C语言本身没有输入输出语句。输入和输出操作是
8、由调用系统提供的输入输出函数来完成的。(7)注释.可以用/*/对C程序中的任何部分作注释。总 结1.3 算算 法法 利用计算机解决问题,首先要编写计算机程序。编制正确的计算机程序必须具备两个基本条件:一是掌握一门计算机高级语言的规则,二是要掌握解题的方法和步骤。计算机语言只是一种工具。简单地掌握语言的语法规则是不够的,最重要的是拟定出有效的解题方法和步骤的算法。1.3.1 算法概述1算法的含义算法是指解决问题的方法和步骤。正确的算法必须满足下列3个条件:(1)每一个逻辑块必须由可以实现的语句来完成;(2)模块与模块之间的关系应该是唯一的;(3)算法要能终止,不能造成死循环。1.3.1 算法概述
9、2算法的特征一个正确的算法具有五个基本特征:(1)有穷性 (2)确定性 (3)输入 (4)输出 (5)可行性 实质上,算法反映的是解决问题的思路。许多问题,只要仔细分析对象数据,就容易找到处理方法。1.3.1 算法概述 算法的表示方法很多,主要有传算法的表示方法很多,主要有传统流程图、统流程图、N-S图、伪代码、自然语图、伪代码、自然语言和计算机程序语言等。这里重点言和计算机程序语言等。这里重点介绍传统流程图和介绍传统流程图和N-S图。图。1.3.2 算法的表示 1.传统流程图起止框处理框判断框连接点流程线Y=xY=-xYNx0输入输出画出求1+2+3+100之和的流程图【例1-4】YNi10
10、0开始s+is,i+1i0s,1i结束输出s的值 A BP成立 不成立A B当P成立 AA直到P成立 1973年美国学者提出的一种新的流程图形式。完全去掉带箭头的流程线,全部算法写在一个矩形框内,框可以包含其它从属于它的方框。这种流程图适于结构化程序设计算法的描述。0s,1i当i100成立s+isi+1i输出s的值2.N-S图本章小结本章小结 本章主要介绍了本章主要介绍了C语言的发展语言的发展和特点,和特点,C语言程序的构成以及算法语言程序的构成以及算法的定义和表示,其中的定义和表示,其中C程序的构成和程序的构成和算法的表示是重点和难点,算法的算法的表示是重点和难点,算法的表示方法中以传统流程
11、图为主,本表示方法中以传统流程图为主,本书后续各章中都使用传统流程图来书后续各章中都使用传统流程图来表示算法。2数据类型、运算符和表达式本章导读 数据是程序处理的对象,是程序设计中的重要组成部分。C语言为我们提供了丰富的数据类型和运算符及语法规则。内容:C语言的基本数据类型、标识符和关键字、常量和变量,运算符与表达式以及数据类型之间的转换等。要求:掌握C语言数据和数据类型的相关知识,熟练掌握运算符和表达式的使用方法。2.1.1 数据类型概述整型(int)数据类型基本类型整型单精度型(float)字符型(char)长整型(long)短整型(short)实型双精度型(double)枚举类型(enu
12、m)(第9章)共用体类型(union)(第9章)构造类型结构体类型(struct)(第9章)数组类型(第6章)空类型(void)指针类型(*)(第8章)2.1 数据类型2.1.2 整型 根据存储长度的不同,C语言中的整型又可分为:基本整型、短整型和长整型,分别用int(基本整型)、short int或short(短整型)、long int或long(长整型)来描述。在这些类型标识符之前还可以加上修饰符unsigned以表示数据是无符号数(0和正整数),没有加unsigned的数据类型为有符号类型,可以描述正整数、负整数和0。2.1 数据类型表2-1 整数类型 类 型 字节数 取值范围 int2
13、-32768 32767 即即 -215(215 1)unsigned int 20 65535 即即 0(216 1)short2-32768 32767 即即 -215(215-1)unsigned short20 65535 即即 0(216-1)long4-21474836482147483647 即即-231(231-1)unsigned long404294967295 即即 0(232-1)2.1.3 实 型 实数类型的数据即通常的实型数据,例如123.45、-36.9、0.0、-2.810-5等。由于计算机中存储实型数据时小数点位置不确定,C语言中实型数据又称浮点型数据。Tur
14、bo C提供了三种表示实数的类型:单精度浮点数类型,简称浮点类型,类型名为float;双精度浮点数类型,简称双精度类型,类型名为double;长双精度类型,类型名为long double。所有整数类型和实数类型统称为算术类型。表2-2 实数类型 类 型字节数有效数字数值范围float47-3.410-38 3.41038double816-1.710-308 1.710308long double1019-3.410-4932 3.4104932以上数据为理论上的参考数据,实际上不同机器可能有以上数据为理论上的参考数据,实际上不同机器可能有差异,例如在有的机器上测试为:差异,例如在有的机器上测
15、试为:-1.2E-383.4E+38(float)-2.3E-3081.7E+308(double)-9.0E-49286.3E+4931(long double)。注意:在注意:在Turbo C 2.0中默认输出中默认输出6位小数,输出位小数,输出double时加时加l修饰修饰,输出输出long double加加L修饰。修饰。2.1.4 字符型字符类型的数据即通常的字符。C语言中字符数据的书写形式是用单引号括起的单个字符,例如用a、B、4分别表示a、B、4字符等,以与源程序中所用的字符相区别。字符数据主要用于表示信息,例如程序的输入和输出信息。此外,文字处理方面的应用程序也必须能使用和处理字
16、符形式的数据。字符类型的数据包括计算机所用编码字符集中的所有字符。常用的ASCII字符集,其中的字符包括所有大小写英文字母、数字、各种标点符号字符,还有一些控制字符,一共128个。扩展的ASCII字符集包括ASCII字符集中的全部字符和另外的128个字符,总共256个字符。字符类型数据在内存中存储的是它的ASCII码编码值,例如A和8分别存储ASCII值65和56。一个字符通常占用内存一个字节。2.1.4 字符型 字符数据与整型数据是相似的。C语言规定字符类型与整型基本一致,即也有有符号和无符号两种类型:有符号类型用char(-128127)表示;无符号类型用unsigned char(025
17、5)表示;类类 型型字节数字节数取值范围取值范围char1-128 127 即即 -27(27 1)unsigned char10 255 即即 0(28-1)2.1.4 字符型2.2 标识符、常量与变量 2.2.1 标识符1.标识符 所谓标识符,是指程序中的变量、符号常量、数组、函数、类型、文件等对象的名字。在C语言中,标识符只能由字母、数字和下划线组成,且第一个字符必须为字母或下划线。使用标识符的具体规则如下:1.标识符使用规则(1)标识符只能由下划线、数字09与大小写字母az,AZ构成。Turbo C最多识别由32个字符组成的标识符,Microsoft C最多识别由8个字符组成的标识符。
18、(2)标识符的首个字符必须是字母或下划线,而不能是数字或其它符号。(3)C语言中大小写字母是敏感的,即在标识符中,大写字母和小写字母代表不同的意义。例如:Name和name是两个不同的标识符。(4)标识符不能使用系统的关键字,因为关键字是系统保留的,它们已有特定的含义。(5)系统预定义标识符,如预编译命令名(define、include)、系统函数名(scanf、printf、getchar、putchar)等可作为用户标识符,但建议不作它用。(6)尽量作到“见名知义”,例如max、score等,而不用象abc、x1、y2等标识符。(7)避免使用易混字符,如1、l、i;0、o;2、z等。1.标
19、识符使用规则2.关键字关键字是指系统预定义的保留标识符,又称之为保留字。它们有特定的含义,不能再作其它用途使用。ANSI C定义的关键字共32个:autodoubleintstructbreakelselongswitchcaseenumregistertypedefcharexternreturnunionconstfloatshortunsigned continue forsignedvoiddefault gotosizeofvolatile doifwhilestatic2.2.2 常 量1.整型常量(1)十进制整数:如154、-565、6523。十进制写法中除非要写的整数本身就是0
20、否则第一个数字字符不能为0。如果要说明是十进制无符号整数则在数据后加u或U,如65535u,12345U等。(2)八进制整数:以0开头,由07八个数字组成的数是八进制数。如0101、-045等是合法的八进制数,其中0101相当于十进制数65。而0185、-02a3是错误的,不能表示八进制数(为什么?)。(3)十六进制整数:以0 x或0X开头的数字序列表示十六进制数。如0 x12为十六进制数,它相当于十进制数18。由于数字只有10个,而在十六进制写法中需要015共16个数字,超过9的数字不能用单个数字表示,C语言采用计算机领域通用的方式,用字母af或AF表示其余的6个十六进制数字,其对应关系如表
21、2-4所示:字字 母母a,Ab,Bc,Cd,De,Ef,F表示的数字表示的数字101112131415表2-4 十六进制数字的表示方法2.2.2 常 量【注意】八进制、十进制和十六进制只是整数的不同书写形式,提供多种写法只是为了使用方便,我们可以根据需要选择适当的书写方式。日常生活中我们习惯使用十进制数,而在计算机中存储的数据都是二进制的,由于二进制与八进制和十六进制的换算关系简单,有些情况下用八进制和十六进制的写法会更方便些。但无论何种写法,上述数据类型仍然是整型,并不是其他新的类型。另外还要注意:C语言中不用二进制形式表示整数。2.2.2 常 量长整型常量的表示方法:在上述方法表示的整数后
22、面后附一个字母l 或L作后缀,即可表示该数据的类型是长整型的。例如65L、-234234L表示十进制有符号长整型数,345678lu,35LU等表示十进制无符号长整型数。2.2.2 常 量2.实型常量在在C语言中,把带小数的数称为实数或浮点数。语言中,把带小数的数称为实数或浮点数。实型常量只能用十进制形式表示。实型常量只能用十进制形式表示。表示方法:表示方法:(1)小数形式。小数形式。由数字序列和小数点组成,如由数字序列和小数点组成,如3.14159、-0.12、.5、2.等都是合法的实数形式。等都是合法的实数形式。(2)指数形式。指数形式。由一个整数或小数后面跟有一个由一个整数或小数后面跟有
23、一个指数部分组成,指数部分以指数部分组成,指数部分以e或或E开头跟一个正的开头跟一个正的或负的整数,表示以或负的整数,表示以10为底的指数。如:为底的指数。如:3.4e-4或或3.4E-4表示表示3.410-4,1.23E4、1.23E+4、1.23e4或或1.23e+4均表示均表示1.23104。2.2.2 常 量注意:字母e或E之前(即尾数部分)必须有数字,例如E2是不合法的表示。e或E后面的指数部分必须是整数,指数部分无整数或为小数均是错误的,例如1.0e 和4e-4.5均是不合法的表示。3.14159可表示为:可表示为:0.0314159102C语言表示为语言表示为0.0314159e
24、+2;或或3141.5910-3C语言表示为语言表示为3141.59e-3 2.2.2 常 量3.字符常量 字符型常量是由一对单引号括起来的单个字符构成。例如:a、B、2等 一个字符型常量的存储值是该字符集中对应的ASCII编码值,常用字符的ASCII编码值如下:AZ(6590),az(97122),09(4857),空格字符(32)。可以看出:大写字母、小写字母、数字字符ASCII编码值都是连续的。2.2.2 常 量 除了可见字符以外,还有一些特殊的控制字符无法直接写出,例如换行符等。C语言为它们规定了特殊写法:以反斜杠()开头的一个字符或一个数字序列,这类字符称为转义字符.如:n、214等
25、,具体见下表。转义字符2.2.2 常 量字符形式字符形式功功 能能n换行,将光标从当前位置移到下一行开头换行,将光标从当前位置移到下一行开头t横向跳格,光标跳到下一个水平制表位横向跳格,光标跳到下一个水平制表位b退格退格r回车,将光标从当前位置移到本行开头回车,将光标从当前位置移到本行开头f换页,将光标从当前位置移到下一页开头换页,将光标从当前位置移到下一页开头反斜杠字符反斜杠字符“”单引号字符单引号字符“”双引号字符双引号字符“”ddd1到到3位位8进制数所代表的字符进制数所代表的字符xhh1到到2位位16进制数所代表的字符进制数所代表的字符2.2.2 常 量4.字符串常量字符串常量是由一对
26、双引号括起的字符序列.例如“abc”、“a”等,其中“a”的存储形式:字符串常量与字符常量的区别:(1)字符常量由单引号括起来,字符串常量由双引号括起来(2)字符常量只占一个字节的内存空间,字符串常量存储串中所有字符和串结束标记0,其ASCII值为0(3)字符常量只能表示单个字符;而字符串常量则可以含一个或多个字符,甚至还可以没有字符。a02.2.2 常 量5.符号常量 以上介绍了以上介绍了C语言几种类型常量的直接表语言几种类型常量的直接表示形式,又叫示形式,又叫“直接常量直接常量”。与此相对应的还。与此相对应的还有所谓的有所谓的“符号常量符号常量”。符号常量就是使用标。符号常量就是使用标识符
27、定义一个常量,例如可用如下方法定义识符定义一个常量,例如可用如下方法定义PI代表代表3.14159:#define PI 3.14159 这种常量定义在这种常量定义在C语言中被称之为语言中被称之为“宏定宏定义义”,具体方法将在本书第,具体方法将在本书第11章中介绍。章中介绍。2.2.2 常 量/*EX2-1.C */#define PI 3.14159main()float r,c,s;scanf(%f,&r);c=2*PI*r;s=PI*r*r;printf(r=%f,c=%f,s=%fn,r,c,s);【例2-1】输入圆的半径,计算周长和面积2.2.3 变 量变量是指在程序运行过程中其值可
28、以被改变的量 三个要素:变量名变量的存储单元变量(存储单元存放)的值。1.变量的定义类型 变量名=初值,变量名=初值,;例如下面的两条变量定义语句例如下面的两条变量定义语句 int a;float f;int a,b,c,max;int a=1,b=2,c=3,max;不能用 int a=b=c=3;int a=3,b=3,c=3;注意普通变量的初始化不是在编译阶段完成的,而是在程序运行执行到本函数时才给变量赋以初值。2.2.3 变 量(1)编译系统将根据定义检测函数中的变量名。例如在语句:maxx=3;中变量max错写成了maxx,编译系统将提示maxx没有被定义的错误信息。(2)编译系统将
29、对每一个变量根据它被定义的类型分配相应的存储单元。例如对上述被定义的变量a、b、c和max分别分配2字节的整型存储单元,对变量f分配4字节的单精度实型存储单元。2.2.3 变量定义的作用 可以用长度运算符sizeof()求出任意类型变量存储单元的字节数。例如对int型变量a和float型变量f,sizeof(a)和sizeof(f)的值分别为2和4。也可以用sizeof()作用到类型标识符上,如:sizeof(int)和sizeof(float)得到同样的结果。2.2.3 变量定义的作用2.2.3 变量定义的作用(3)编译系统根据变量被定义的类型检查该变量进行运算的合法性。例如上述整型变量a、
30、b、c和max均可以参与求余运算,例如b对c求余的结果赋给a:a=b%c;是合法的,而实型变量f参加求余运算将是非法的。(4)可以给变量赋初始值。如果没有赋初值,普通变量将存储随机值,直到给它赋值为止。定义变量应注意以下问题:(1)变量名可以是任何合法的标识符。例如a、b2、c_1、_3y等均是合法的变量名,而#abc、.com、¥b1、5fd2、for等均是不合法的变量名。.见名知义.区分大小写字母(2)在一个函数中,同一个变量不能被定义两次。2.2.3 变量定义的作用2.变量的赋值 变量的赋值就是给变量的存储单元存储一定的值。赋值操作由赋值运算符“=”实现。赋值方式:(1)在定义变量时给变
31、量初始化赋值 (2)在程序运行时用赋值语句给变量赋值,如:inta,b,c;a=2;b=5;c=10;与初始化赋值不同,用赋值语句给多个变量赋相同的值可以采用连续赋值的形式。如:a=b=c=10;3.整型数据的存储补码complement)216-|a|(-32768a0)a的补码=a (0a32767)4.整型数据的溢出 由于在计算机中只能用有限的二进制位存放数据,各种类型数据的存储都有溢出问题。对整型数据的存储,溢出的情况有:(1)由于存储的位数有限,绝对值大于存储范围的数在存储时将溢出;(2)由于有符号的数用补码存储,当存储的补码改变到表示负数范围时将表示负数。/*EX2-2.C */m
32、ain()int a,b,c;unsigned u,v;a=32767+1;b=131071;c=-98304;u=131071;v=-98304;printf(a=%d,b=%d,c=%dn u=%u,v=%un,a,b,c,u,v);【例2-2】整型数据的溢出5.实型数据的存储 与整型数据的存储情况不同,为了扩大表示数的范围,实型数据是按指数形式存储的。以微机中存储float型数据为例,float型数据在内存中占据4个字节即32位二进制信息,分别存放符号位、规格化的尾数、阶符位和阶码。6.实型数据的舍入误差 我们知道,除了溢出以外,整数存储是没有误差的。然而,由于实型变量是用有限的存储单元
33、存储较大范围的实数,提供的有效数字总是有限的,尾数在有效位以外的部分将被舍去,因此实型数据是有误差的。(1)一个比较小的数与一个比较大的数求和,和的有效位数超过允许的范围,最后的结果是比较小的数没起作用,尽管它并不很小。(2)4.0/3.0*3.0,按数学常识结果应等于4.0,然而由于舍入误差,其结果并不等于4.0。/*EX2-3.C */main()float x,y;x=123456.789E5;y=x+30.0;printf(x=%f,y=%fn,x,y);【例2-3】实型数据的舍入误差7.字符数据的存储与使用 字符类型数据的存储与整型数据的存储十分相似,也分成有符号和无符号两种,只是用
34、一个字节8位二进制信息存储字符类型数据。01000001c (0c127)28-|c|(-128a =!=3.逻辑运算符逻辑运算符!&|4.位运算符位运算符|&5.赋值类运算符赋值类运算符=及及 自反赋值运算符自反赋值运算符 6.条件运算符条件运算符?:7.逗号运算符逗号运算符,8.指针及求地址运算符指针及求地址运算符*&9.求存储单元字节数运算符求存储单元字节数运算符sizeof10.类型转换运算符类型转换运算符(类型)(类型)11.结构体成员运算符结构体成员运算符 -12.下标运算符下标运算符 13.其他运算符其他运算符 如函数调用运算符如函数调用运算符()等等 学习运算符要注意几个方面问
35、题:学习运算符要注意几个方面问题:(1)运算符的功能;运算符的功能;(2)运算符与操作对象的关系:运算符与操作对象的关系:操作数的个数操作数的个数(单目、双目、三目单目、双目、三目);操作数的类型(如求余运算符操作数的类型(如求余运算符%要求操作数要求操作数是整型);是整型);结合方向(操作数到运算符):左结合、右结合方向(操作数到运算符):左结合、右结合结合(单目、赋值类、条件运算符单目、赋值类、条件运算符);(3)运算符的优先级;运算符的优先级;(4)运算结果的数据类型:不同类型数据运算将运算结果的数据类型:不同类型数据运算将发生类型转换发生类型转换2.3 运算符与表达式2.3.1 算术运
36、算符与算术表达式C语言中基本的算术运算符共有5个,分别为:+(加),-(减),*(乘),/(除),%(取模,或称求余)(1)双目运算符,结合方向均为从左到右。双目运算符,结合方向均为从左到右。(2)%(取模)运算符仅用于整型变量或整型常量(取模)运算符仅用于整型变量或整型常量的运算,的运算,a%b结果为结果为a除以除以b的余数,余数的符号与的余数,余数的符号与被除数相同,如:被除数相同,如:7%3的值为的值为1;17%-3的结果为的结果为2;-19%4的结果为的结果为-3。2.3 运算符与表达式2.3 运算符与表达式(3)+、-、*、/运算符的两个操作数既可以是整数,也可以是实数。(4)/(除
37、法)运算符,当对两个整型的数据相除时结果为整数,如:7/3,其值为2,舍去小数部分,相当于整除操作;当操作数中有一个为负数时,整除结果取整为向0靠拢(商的绝对值不大于操作数绝对值的商),如:-5/3=-1。基本算术表达式:基本算术运算符、括号以及操作对象组成的符合C语言语法规则的表达式.2.3.1 算术运算符与算术表达式优先级:(*、/、%)同级较高,(+、-)同级较低结合方向:当一个运算对象两侧的运算符的优先级别不同时,应遵循优先级高的先处理的规则。当一个运算对象两侧的运算符的优先级别相同时,应遵循运算符的结合方向。算术运算符的结合方向是从左至右。有时为了达到某种目的,需要将一个表达式有时为
38、了达到某种目的,需要将一个表达式的类型转变成所需的类型,这时就要用到强制类的类型转变成所需的类型,这时就要用到强制类型转换运算符。型转换运算符。作用形式:作用形式:(类型类型)(表达式表达式)将表达式的值转换成相应类型将表达式的值转换成相应类型例如:例如:(double)a (int)(x+y)(float)5/3优先级:同所有单目运算符,高于基本算术运优先级:同所有单目运算符,高于基本算术运算符。算符。3.强制类型转换(显式转换)运算符3.强制类型转换(显式转换)运算符注意:表达式一定要加括号(因强制类型转换是单目运算,优先级高),例如上面最后一个表达式中只是将5转变成float型,而不是将
39、5/3转变成float型。若对变量实型显式转换,将得到新类型的一个值,原变量的类型及其存储值均不变。/*EX2-7.C */main()float x=3.6;printf(%d,(int)x);printf(%fn,x);【例2-7】强制类型转换 由于求余(取模)运算只能针对整型数据,因此经常用强制类型转换的办法将一个实型量(变量或常量)变换成整型,然后才能进行取模运算,例如:(int)5.5%3。4.自增自减运算符:+和-自增自减运算符+和-是C语言中最常用也最难掌握的两个单目运算符,具有右结合性。他们的作用是:只作用于变量,使变量的值自增1或自减1。如+i相当于i=i+1;-j相当于j=
40、j-1,因此+、-实质也有赋值作用。由于不能对常量或表达式赋值,因此象3+,(a+b)-等都是错误的。4.自增自减运算符:+和-+和-运算符的前缀运算与后缀运算 (1)前缀运算+i:相当于i=i+1且表达式的值与i的值相同(先增值后引用);同样,-j相当于j=j-1且表达式的值与j的值相同。(2)后缀运算i+:先取i的值作为表达式的值,i再自增1(先引用后增值);同样,j-:先取j的值作为表达式的值,j再自减1(先引用后减值)。/*EX2-8.C */main()int i=5,j;j=+i+i+;printf(i=%d,j=%dn,i,j);i=5;j=(+i)+(+i)+(i+);prin
41、tf(i=%d,j=%dn,i,j);printf(%d%dn,i+j,j+);【例2-8】输出下面程序中i、j的值2.3.2 赋值运算符与赋值表达式 1.赋值运算符赋值运算符 C语言中赋值运算符为语言中赋值运算符为“=”,它的作用的一般形,它的作用的一般形式为:式为:变量变量=表达式表达式 即将即将“=”右边的表达式的值赋给其左边的变量。右边的表达式的值赋给其左边的变量。如:如:a=5;/*表示把一个常量表示把一个常量5赋给变量赋给变量a*/x=a+5;/*表示将表达式表示将表达式a+5的值赋给变量的值赋给变量x*/如果赋值运算符两侧的类型不一致,在赋值时要如果赋值运算符两侧的类型不一致,在
42、赋值时要将表达式将表达式值的类型值的类型转换成变量的类型,然后再赋给转换成变量的类型,然后再赋给变量变量 几点说明:几点说明:(1)“=”是赋值运算符,不是等于号(等于号是是赋值运算符,不是等于号(等于号是=)。)。(2)赋值运算方向为自右向左。赋值运算方向为自右向左。(3)赋值运算的过程:先计算表达式,然后将计算结果转赋值运算的过程:先计算表达式,然后将计算结果转换成变量的类型后存到变量的存储单元中,该变量原有的换成变量的类型后存到变量的存储单元中,该变量原有的值被覆盖。值被覆盖。(4)赋值运算符左边只能是变量,不能是常量或表达式,赋值运算符左边只能是变量,不能是常量或表达式,如如2=a和和
43、a+b=c都是错误的。都是错误的。(5)赋值运算符的优先级较低(只高于逗号运算符),因赋值运算符的优先级较低(只高于逗号运算符),因此一般情况下表达式无须加括号,如此一般情况下表达式无须加括号,如a=2+7/3将值将值4赋给变赋给变量量a。(6)赋值运算是一个表达式,其值即赋值后变量的值,该赋值运算是一个表达式,其值即赋值后变量的值,该值可赋给其它变量值可赋给其它变量 2.3.2 赋值运算符与赋值表达式 C语言允许在赋值运算符语言允许在赋值运算符“=”之前加上其他运算之前加上其他运算符以构成复合的赋值运算符。符以构成复合的赋值运算符。基本算术运算符和位运算符。有:基本算术运算符和位运算符。有:
44、+=,-=,*=,/=,%=,=,&=,=,|=2.复合赋值运算符a+=5 等价于等价于a=a+5 c-=d 等价于等价于c=c-da*=b+5 等价于等价于 a=a*(b+5)g/=h-f 等价于等价于 g=g/(h-f)a%=5 等价于等价于 a=a%5 3.赋值类运算符的副作用及限制(1)费解,易于误解。(2)不定解:因机器不同得到不同的结果。(3)注意:对赋值类运算符,交换律不成立c=b*=a+2;j=3;i=(k=j+1)+(j=5);若先算后面括号,结果为i=11;若先算前面括号,结果为i=9;i=(j=5)+(k=j+1);4.算术表达式的计算 优先级优先级类型类型运算符运算符结
45、合性结合性1结构类结构类()2单目单目+、-、+、-、sizeof()3双目双目*、/、%4双目双目+、-5赋值类赋值类=、+=、-=、*=、/=、%=1.圆括号优先级最高,有多层圆括号从内向外运算圆括号优先级最高,有多层圆括号从内向外运算2.(类型名类型名)(表达式表达式)为强制类型转换运算;为强制类型转换运算;3.先按运算符的优先级由高到低进行,如先按运算符的优先级由高到低进行,如5*-2相当相当于于5*(-2),结果为,结果为-10;同级的运算符按结合方向进行;同级的运算符按结合方向进行 例:设有变量声明float a=3.0;int b=2;计算表达式:2+sqrt(1.0+a)*b+
46、/2解:2+sqrt(1.0+a)*b+/22+sqrt(4.0)*b+/22+2.0*2/22+4.0/22+2.04.0 即表达式的值为4.0,同时b的值变为3,a的值不变。4.算术表达式的计算 2.3.3 逗号运算符与逗号表达式1.逗号运算符逗号运算符 ,用逗号运算符可以将两个表达式连接起来。如:用逗号运算符可以将两个表达式连接起来。如:2+3,2+52.逗号表达式逗号表达式 用逗号运算符连接两个或两个以上表达式所形用逗号运算符连接两个或两个以上表达式所形成的新表达式就是逗号表达式,其一般形式为:成的新表达式就是逗号表达式,其一般形式为:(表达式表达式1),(表达式表达式2),(表达式表
47、达式n)求值过程:先求表达式求值过程:先求表达式1的值,再求表达式的值,再求表达式2的值的值,,最后求表达式最后求表达式n的值。表达式的值。表达式n的值就是整个逗的值就是整个逗号表达式的值。号表达式的值。一个逗号表达式可以与另一个表达式构成一个新的逗号表达式。例如:(a=2+3,a*5),a+10 优先级:逗号运算符是所有运算符中级别最低的.结合性:逗号表达式的结合性为自左向右的。2.3.3 逗号运算符与逗号表达式/*EX2-9.C */main()int y=3,x=3,z=1;printf(%d%dn,(+x,y+),z+2);【例2-9】分析下面程序的运行结果2.4 数据类型转换2.4.
48、1类型转换概述 三种方式:类型自动转换、赋值类型转换和强制类型转换 1.不同数据类型的差异(1)floatdouble(2)(char,short,int,long)(float,double)(3)charshortintlong(4)signedb)c=b;else c=a;return(c);/*将变量c的值通过返回语句带回调用处*/C程序源程序文件1源程序文件2源程序文件n预处理命令全局变量声明函数1函数2函数n函数首部函数体局部变量声明执行语句C语言程序结构 图 顺序结构是程序设计中最简单、最基本的结构,其特点是程序运行时,按语句书写的次序依次执行,其结构如图所示。AB顺序结构流程图
49、3.2.2 顺序结构预处理语句变量a,b,c声明输入变量a,b的值赋值语句c=a+b输出变量c的值/*EX3-1.C */#include main()int a,b,c;scanf(%d,%d,&a,&b);c=a+b;printf(nc=%dn,c);分析下面程序结构【例3-1】例3-1的流程 从例3-1可以看出,顺序结构的程序框架如下:分析#开头的预编译处理命令行main()局部变量声明语句;可执行语句序列;3.3 赋值语句 赋值语句是一个应用十分普遍且最简单的语句。赋值语句的一般形式:x=e;其中:x是变量名,“=”前面已介绍过,是赋值号,e是表达式。赋值语句的功能是将赋值号右边表达式
50、的值计算出来,再赋给赋值号左边变量。前面我们已经学过了赋值表达式,要注意区分两者的不同点:小 结(1)赋值表达式不能有分号“;”,而赋值语句一定要有分号“;”,这是最本质的区别。(2)赋值表达式中的赋值号“=”可以连用,而赋值语句中的赋值号“=”不能连用。(3)赋值表达式可以包括在其他表达式之中。3.4 数据输入与输出 printf()函数的功能是向系统指定的设备输出若干个任意类型的数据。3.4.1 格式化输出函数 printf()1.printf()函数调用形式 printf函数是一个标准库函数,其调用的一般形式:printf(格式控制字符串,输出列表);格式说明一般字符按原样输出转义字符作