c语言教材第一章.ppt
1,开篇,本课程讲述如何使用C语言进行真正的编程 为什么学习c语言?C语言是目前实际程序设计工作中使用最广泛的语言之一 它包含了程序设计需要理解和使用的基本程序机理和主要机制 掌握这些机制就可以理解程序与程序设计的主要问题。目前有许多软件系统是用C编写的,或基本上是用C编写的 学习程序设计的同时也能掌握一种实用的程序设计工具 C语言是一种很灵活的语言 既可以在较高层次上做,也可以在较低级的层次上做 很多新型的语言都是衍生自C语言 有些本身就是C语言的扩充和发展 程序设计是计算机领域的基础课程 C语言适合作为计算机领域许多后续课程的教学语言,2,开篇,本课程讲述如何使用 C语言进行真正的编程 授课重点 侧重学习一个具体问题的算法化的过程 学习应该掌握的基本编程技巧以及C编程的风格和艺术 讨论 怎样编写出一个好的程序?简单、实用的原则,3,开篇,本课程的组织,算法概念、编程原理、编程风格、基本数据类型定义、算术运算符及 表达式,顺序结构、选择结构、循环结构、数组的定义及应用、程序设计过程,函数、变量的存储类别、指针、结 构体与共用体、文件,4,1.程序与程序设计语言,什么是程序?什么是计算机?计算机是一种具有内部存储能力的自动、高效的电子设备,计算机怎样完成工作?执行存放在计算机的内部存储器中的指令 程序是计算机指令的序列 可以被连续执行的一条条指令的集合称为计算机的程序,5,1.程序与程序设计语言,什么是计算机语言?是与计算机交流的工具 人和人交流用的是双方都能听懂和读懂的自然语言 人和计算机交流也要用人和计算机都容易接受和理解的语言 计算机语言是根据计算机的特点而编制的 有限规则的集合 什么是程序设计语言?计算机语言又称为“程序语言“一个计算机程序总是用某种程序语言来编写,6,1.程序与程序设计语言,程序设计语言的发展 问题?怎样从功能和使用方式上来划分程序设计语言?他们各有什么特点?举例。,7,2.程序设计,什么是程序设计?使用某种程序语言编写程序的过程 是用计算机语言对所要解决的问题中的数据以及处理问题的方法和步骤所做的完整而准确的描述的过程 怎样进行程序设计?分析问题 确定算法 编制程序 调试程序,8,2.程序设计,一个完整的程序 数据结构、算法、编程语言和程序设计方法 对数据的描述(数据流)指定数据的类型和数据的结构 对操作的描述(控制流)指定操作的步骤,既算法,程序=数据结构+算法,9,3.算法,输入三个数,然后输出最大的数 算法的两个要素 基本功能操作 数据运算和传输 控制结构 顺序、选择和循环三种基本控制流程,算法可以写成:(1)输入A,B,C;(2)若AB,则A-MAX;若AMAX。(3)若CMAX,则C-MAX。(4)输出MAX,MAX既是最大数。,10,3.算法,算法的特性 有穷性 应含有有限的操作步骤,不能是无限的。有穷性指在“合理的限度之内”唯一性 每一个步骤都是确定的,只有一个涵义,不可以为二义性 有零个或多个输入 在执行算法时需要从外界获取必要的信息 有一个或多个输出 算法执行的目的就是为了求解,“解”就是输出的信息 没有输出的算法是没有意义的 正确性 每一个步骤应当被有效的执行,并得到确定的结果,11,3.算法,算法的表示 流程图,12,3.算法,算法的表示 流程图,13,3.算法,算法的表示 N-S图 是适合结构化程序设计方法的图形工具 N-S流程图无法表示非结构化的程序,14,3.算法(练习),算法的表示 其它 典型算法,15,4.结构化的程序设计方法,程序的三种基本结构 问题的提出 结构化程序设计必须采用的结构 顺序结构、选择结构和循环结构 被称为程序设计的三种基本结构 算法的实现过程是由一系列操作组成的,这些操作之间的执行次序就是程序的控制结构 总体结构流程都是自上而下顺序执行的。,16,4.结构化的程序设计方法,程序的三种基本结构 顺序结构 顺序结构表示程序中的各操作是按照它们出现的先后顺序执行的 选择结构 表示程序的处理出现了分支,它需要根据某一特定的条件选择其中的一个分支执行 循环结构 程序反复执行某个或某些操作,直到某条件为假(或为真)时才可终止循环,17,4.结构化的程序设计方法,结构化程序设计方法 公认的面向过程编程应遵循的基本方法和原则 结构化程序设计特征 采用模块化结构 自顶而下的设计方法 便于对问题的分解和模块的划分 程序由三种基本控制结构组成 有限制地使用转移语句 采用结构化程序设计语言书写程序 结构化程序设计语言书写程序 注意书写风格,18,5.什么是C语言?,1973年由美国贝尔实验室设计发布的 目前是计算机程序设计语言的主流语种 是世界上最为广泛使用的语言之一 C语言的流行归功于两个主要因素 使用正确的C语言指令几乎可以完成任何任务 是可移植的C编译系统的广泛采用 C语言是一种能够让软件工程师与计算机进行有效对话的介于汇编语言和高级语言之间的编程语言 C语言标准 1978年,正式出版的The C Programming Language书中介绍的C语言,称为标准C语言 1983年,美国国家标准化协会(ANSI)根据各种C语言版本对C的扩充和发展,颁布了C语言的新标准ANSI C ANSI C比标准C有了很大的扩充和发展 1987年,美国国家标准化协会又颁布新标准,称为87 ANSI C 1990年,国际标准化组织ISO接受了87 ANSI C作为ISO C的标准 目前功能最完善、性能最优良的C新版本 目前流行的C编译系统都是以它为基础的,19,5.什么是C语言?,C语言的特点 适合开发系统软件 结构化的程序设计语言 丰富的数据类型和数据结构 运算符多样化 可移植性好 语句简洁紧凑 编程风格灵活,语法限制少,使用灵活 具有预处理功能 面向对象程序设计的基础,20,编写一个加法运算程序,#includestdio.h main()int a,b;/*定义两个整形变量*/a=1;b=5;/*给两个变量赋值*/printf(“%d+%d=%dn”,a,b,a+b);/*打印a和b之和*/,C语言严格区分大、小写 英文字母。,C语言程序习惯上使用小写英文字母,而大写英文字母通常作为常量的宏定义和其他特殊的用途。,5.什么是C语言?,21,#includestdio.h main()int a,b;/*定义两个整形变量*/a=1;b=5;/*给两个变量赋值*/printf(“%d+%d=%dn”,a,b,a+b);/*打印a和b之和*/,C语言严格区分大、小写 英文字母。,例:编写一个加法运算程序如下:,5.什么是C语言?,C语言程序是由一个个的 语句组成。,每个语句都具有规定的语法格式和特定的功能。,编写一个加法运算程序,22,#includestdio.h main()int a,b;/*定义两个整形变量*/a=1;b=5;/*给两个变量赋值*/printf(“%d+%d=%dn”,a,b,a+b);/*打印a和b之和*/,C语言严格区分大、小写 英文字母。,例:编写一个加法运算程序如下:,5.什么是C语言?,C语言程序是由一个个的 语句组成。,C语言程序使用“;”作为 语句的终止符和分隔符。,可以任意书写,即一行中可以书写多个语句,一个语句也可以占用任意多行,语句之间必须用“;”分隔。初学时建议在一行内书写一条语句。,编写一个加法运算程序,23,#includestdio.h main()int a,b;/*定义两个整形变量*/a=1;b=5;/*给两个变量赋值*/printf(“%d+%d=%dn”,a,b,a+b);/*打印a和b之和*/,C语言严格区分大、小写 英文字母。,例:编写一个加法运算程序如下:,5.什么是C语言?,C语言程序是由一个个的 语句组成。,C语言程序使用“;”作为 语句的终止符和分隔符。,C语言程序中用大括号对“”表示程序的结构层 次范围。,一个完整的程序模块要用一对花括号括起来,用以表示模块的范围。为了清晰地表现出程序的结构,建议使用右缩进锯齿型程序书写格式。,编写一个加法运算程序,24,#includestdio.h main()int a,b;/*定义两个整形变量*/a=1;b=5;/*给两个变量赋值*/printf(“%d+%d=%dn”,a,b,a+b);/*打印a和b之和*/,C语言严格区分大、小写 英文字母。,例:编写一个加法运算程序如下:,5.什么是C语言?,C语言程序是由一个个的 语句组成。,C语言程序使用“;”作为 语句的终止符和分隔符。,C语言程序中用大括号对“”表示程序的结构层 次范围。,语言程序可以使用注释。,注释部分的格式是:注释内容注释部分不参与程序的执行,对程序的运行结果没有影响,只是用来提示或助记。,编写一个加法运算程序,25,5.什么是C语言?,C程序结构组成 C程序为函数模块结构,整个程序都是由一个或多个函数组成 函数是由函数说明和函数体两部分组成 一个C程序总是从main()函数开始执行 被调用的函数可以是系统提供的库函数,也可以是用户根据需要自己编制设计的函数(用户自定义函数)一个C 程序可以由一个文件组成,也可以由若干个文件组成,分析下面程序:#include main()int a=1,b=5,c;c=add(a,b);printf(“c=%dn”,c);int add(int x,int y)return(x+y);,26,C程序结构组成,5.什么是C语言?,注意 一个函数名后面必须跟一对(),函数参数可以没有,但这 一对()不能省略,如main()在函数定义中第一行的函数名后没有分号“;”,27,5.什么是C语言?,标识符 每种程序语言都规定了在程序里描述名字的规则 这些名字包括:变量名、常数名、数组名、函数名、文件名、类型名等,被统称为标识符 C语言标识符 C语言的标识符是满足如下条件的字符序列 只能由英文字母、数字和下划线组成 必须以英文字母或下划线开头 注意 标识符的使用很多,使用时要注意语言规则 C语言对大、小写字母严格区分 根据ANSI标准,只有前31个字符是有意义,但一般系统使用的标识符,其有效长度不超过8个字符 标识符不要与关键字同名,28,5.什么是C语言?,关键字 具有特定含义的,用作专用的标识符 语言中关键字绝大多数是由小写字母构成的字符序列 注意:这些特定的关键字不允许用户作为自定义的标识符使用,例:指出合法的标识符与关键字“ABA”S05 file.c 10page printf yellow_red a&b-113 _ACG Abc,29,5.什么是C语言?,语句 语句是组成程序的基本单位 它能完成特定操作 所有程序设计语言都提供了满足编写程序要求的一系列语句 有确定的形式和功能 C语言中的语句,30,6.C语言的开发与运行,开发一个C程序,一般过程,编辑:使用一个文本编辑器将编写好的C程序输入计算机,并以 文本文件的形式保存C语言源程序,其文件扩展名为“.C”,编译:使用一个C语言编译系统(如TurboC 2.0)对C语言源程序 进行语法检查和翻译,生成同名的“.OBJ”目标文件,链接:将目标文件和系统提供的标准库函数等连接在一起,生成 一个同名的“.EXE”可执行文件,执行:脱离C语言编译系统,可在操作系统下键入文件名直接运行,31,6.C语言的开发与运行,安装tc2.0 下载 Cd 思考题 C语言程序执行过程是如何进行的?应注意什么问题?,32,7.小测验,根据语言标识符的命名规则,以下全部合法的标识符是:A)2xy,x+y,10 xy,xy2 B)main(),printf,int,float C)int,char,printf,scanf D)add,x10,_count,x_y 一个语言程序总是从 A)主过程开始执行B)主函数开始执行 C)子程序开始执行D)主程序开始执行,33,数据 数据是程序设计中所要涉及和描述的主要内容 数据是程序加工、处理的对象 数据同样是加工的结果 数据类型 数据类型的概念 数据类型是一类数据的抽象表示,这类数据具有相同的形式,遵从相同的运算规则 程序处理的基本数据按性质划分 属于同一类的各个数据都具有同样的性质 同样的操作 同样的编码方式 把程序语言中具有这样性质的数据集合称为数据类型。,.什么是数据和数据类型,34,.C语言的数据类型,数据类型的分类,数据类型,空类型,指针类型,构造类型,基本类型,指针类型 用于存放地址(指针),用来解决动态数据的建立、删除和使用 空类型 用于数据类型的转换,基本类型 构造简单,已由系统定义好 构造类型 由其它数据类型按一定规则构造而成。,35,.C语言的数据类型,数据类型的分类 提示 每个数据类型都有固定的表示方式 这个表示方式确定了可能表示的数据范围以及数据在内存中的存放形式 C程序中所出现的所有数据都必须明确指定其数据类型 数据类型的体现 常量和变量是在计算机中数据类型的表现形式 不再是抽象的概念而是实在的数据,这些数据符合对数据类型的规定(形式和运算规则两方面)常量和变量之间的区别在于程序执行过程中的变化情况 常量是一成不变的 变量则可以不断改变,36,.C语言的数据类型,数据类型的长度 在计算机中,由于软硬件的各种原因,数据类型必须有一个长度的限制 这个长度是指数据存储在计算机中需要占用多少个字节数 不同类型的数据在内存中占用的字节数是不同的 溢出处理 不同的数据类型规定了不同的机内表示长度,也决定了对应数据量的变化范围,当某一数据超出该数据类型所规定的范围时,计算机会拒绝接受,而将之转换成范围内的另外某个数,这种情况称之为溢出处理。,37,10.常量,常量 在程序运行过程中其值不能被改变的量值 例1:1,200 3.1,-4.0 A,b“abc”,“ABn”提示 在程序中使用常量时,一般不需要具体指出它属于哪一种类型C语言编译系统会自动根据常量的数据大小和直观形式来确定它的数据类型 例2:3,3.0,3,“3”,38,10.常量,语言提供的常量 数值常量 整型 实型 字符常量 字符常量 字符串常量 这些类型决定了各种常量所占存储空间的大小和数的表示范围 特殊形式常量 符号常量,39,10.常量,整型常量 一个整数 常用的整数类型(IBM PC机及其兼容机上对C语言整型数的规定)整型 2字节:-3276832767 长整型 4字节:-21474836482147483647 无符号整型 2字节:065535 无符号长整型 4字节:04294967295 提示:整型常量只区别整型和长整型两种形式,而没有无符号值型常量,40,10.常量,整型常量 三种形式 十进制 有效的十进制数字串 例:100,32767,-120 八进制 以数字“0”开头的八进制数字串 例:0100,0123,-012 十六进制 以数字0 x或0X开头的十六进制字符串 例:0 x123,0 x100,-0 x12 长整型常量 可表示为:十进制、八进制、十六进制 在常数之后加上字母或,35555是否为十进制常量?,0358是否为八进制常量?,41,10.常量,实型常量 实数,又称浮点数 类型 单精度型 4字节:10-38 1038 双精度型 8字节:10-30810308 长双精度型 16字节:10-4931 104932 有效位数 单精度有效数字位数为十进制数的67位 双精度有效数字位数为十进制数的1516位 长双精度型有效数字位数为十进制数的1819位 提示:在语言中,实型常量一般都作为双精度来处理,并且只用十进制数表示,42,10.常量,实型常量 两种形式 小数形式 由正负符号、整数部分、小数点及小数部分组成 例:3.0,5.123,-120.1,0.0 指数形式 由尾数、字母e或E及指数部分组成 例:123.0E-1,-1.23e3 标准的指数形式是:小数点的左侧只有一位数字,43,提示 注意指数必须是不超过数据表示范围的正负整数,并且在e或E前必须有数字 对于超过有效数字位的数位,系统存储时自动舍去 问题:合法的长双精度实型常量的表示形式?,44,C语言中字符型数据和整型数据可以通用 字符型数据在计算机中存储的是字符的ASCII码 ASCII码形式上就是0 到255之间的整数 例如 字符A的ASCII码值用是65 A+32;/*执行结果65+32=97,是a的ASCII码值*/,45,10.常量,字符常量 包括可以全部在计算机上显示的符号 ASCII码表上的全部字符 一个字符的存储占用一个字节 表示方法 用单引号 括起来的一个字符 A,1 用单引号 括起来的以 字符开始的字符 n,t,46,10.常量,字符串常量 是用一对双引号括起来的字符序列 双引号仅做定界符使用,本身不算入字符串常量 例如“ABC”,“”(有空格),“a”,“Happy new Year”,“abcn”,“”(无空格)等 C语言规定字符串的最后必须以空字符0结尾 编译程序总是自动地在字符串的结尾加上一个转义字符0 ASCII码是0,所对应的字符是空 空字符并不计算在字符串的长度里,但是存储时,空字符将会额外的占用一个字节空间,47,10.常量,字符串常量 字符串常量与字符常量的区别 形式 字符常量是用单引号括起的单个字符 字符串常量是用双引号括起的一串字符 存储方式 字符常量在内存中占一个字节 字符串常量除了每个字符各占一个字节外,其字符串结束符0也要占一个字节 例如 字符常量a占一个字节 字符串常量a 占2个字节,a,“a”,(97)10,(97)10,(0)10,48,10.常量,符号常量 在C语言中允许程序中的常量定义为一个标识符,这个标识符称为符号常量 带有名字的常量 定义格式#define 例如:#define AGE 35#define M 1.9734067e9 提示 简化书写格式、减少出错率 定义符号常量可以提高程序的可读性,便于程序的调试和修改 符号常量不同于变量,在其作用域内不能被改变和重新赋值 习惯上人们把符号常量名用大写字母表示,10.常量练习,定义常量并输出,50,11.变量,变量 在程序运行过程中其值发生改变(可以被改变)的量值 C语言规定所有用到的变量都必须在程序中指定其数据类型,必须“先定义后使用”一个变量应该有一个名字(标识符)定义变量时要给其命名 一个变量应该有一种数据类型 编译系统根据定义变量的数据类型为其分配存储单元并在该存储单元中存放变量的值,51,11.变量,每个变量都由一个变量名来标识 在C语言中,变量名作为变量的标识,其命名规则符合标识符的所有规定 语言规定标识符只能由字母、数字和下划线组成且第一个字符必须是字母或下划线 提示 大、小写字母被认为是不同的变量名 例:Sun、sun、SUN是三个不同的变量 为了避免混淆,变量命名应取不同的名字而不是用大小写区分 尽量取与变量含义接近的名称,变量的命名,52,11.变量,变量的定义 变量定义的目的 定义变量名 定义变量的数据类型 变量的类型决定变量的存贮结构,使C语言的编译程序为所定义的变量分配存储空间 变量的定义说明了变量叫什么以及用来做什么 定义一个变量的过程,实际上就是向内存申请一个变量的数据类型大小的空间的过程 变量实质上就是内存某一单元的标识符号,对这个符号的引用就是对相应的内存单元的存取操作,53,11.变量,变量的定义 用类型说明语句对变量进行定义 定义格式 type namelist;类型说明符Type是语言中的一个有效的数据类型 变量表namelist的形式是:变量名1,变量名2,变量名n,用逗号分隔的变量名的集合 例 int a,b23,C_123;float sum;char max_ch;变量的基本数据类型 整型、实型、字符型,54,11.变量,整型变量 不同类型的差别在于占用不同的存储空间 采用不同位数的二进制编码方式 计算机内部总是采用二进制补码形式表示一个数值型数据 例如:整型的最高位为符号位:“1”表示负数,“0”表示正数,其余15位表示数值 无符号整型数全部16位表示数值,55,11.变量,整型变量 一个整型变量可以保存一个整数 整型类型的基本标志是int 基本型(int)短整型(short int、short)长整型(long int、long)无符号整型(unsigned int、unsigned long、unsigned short)例 int a;long b;unsigned int c;提示 使用某种类型的变量时,一定要注意该类型变量的取值范围,56,11.变量,实型变量 存储实型数据 ANSI C允许的定义三种实型变量 float 单精度型 Double 双精度型 long double 长双精度型 例 float a,b;double x;long double y;提示 运用实数运算时要合理使用不同的类型,尽可能减少误差 一个实型常量可以赋给float或 double型变量,根据变量的类型截取实型常量的相应有效位数,57,11.变量,字符变量 用来存放一个字符常量 即一个字节存放一个字符 标示:char 例:char c1,a2;提示 不能将一个字符串常量赋给一个字符变量 例:char c1,c2;c1=a;c2=b;合法 c1=“a”;c2=“b”;非法,58,11.变量,变量赋值 初始化赋值方式(声明语句)C语言允许在定义一个变量的同时对变量进行初始化 例:int i=0;/*表示定义一个整型变量i的同时将i赋值为0*/int i,j,k=10;/*表示i,j,k为整型,只有k被赋值为10*/提示 如果对几个变量同时赋一个初始值,则可以写成 float a=3.0,b=3.0,c=3.0;表示a、b、c的初始值均为3.0,但并不表示整个程序中三个变量值一直不变或一直相等 先说明后赋值方式(赋值语句)在程序运行过程中用赋值语句给变量赋一个值 例如 a=10;,59,11.变量,变量在使用中应注意的问题 变量要先定义后使用 常量与变量的类型要匹配,例题:编写求两数和的C程序并上机运行。main()int a,b;a=32767;b=10;c=a+b;printf(c=%dn,c);/*输出变量c的值*/会出现什么问题?如何解决?,60,12.运算符与表达式,运算符 C语言用于描述对数据进行运算的特殊符号 语言具有丰富而繁多的运算符 由运算符构成了各种表达式 分类 语言的运算符按其在表达式中与运算对象的关系 单目运算 一个运算符连接一个运算对象 双目运算 一个运算符连接两个运算对象 三目运算 一个运算符连接三个运算对象,61,12.运算符与表达式,运算符 分类 语言的运算符按其在表达式中的作用 算术(自增/自减)运算符:(+,*,/,%、+、-)关系运算符:(,=,、|、&)赋值运算符:(=)条件运算符:(?:)逗号运算符:(,)指针运算符:(*,&)强制类型转换运算符:(type)分量运算符:(和)下标运算符:()函数调用运算符:(()),62,12.运算符与表达式,运算符 对运算符的掌握应从三个方面着手 和操作符相关的数据类型(包括操作数和操作结果的数据类型)运算符的优先级 运算符的结合次序,63,12.运算符与表达式,表达式 用运算符将运算对象连接而成的符合语言规则的算式 特别地:一个常量、一个变量、一个函数都可以看成是一个表达式 表达式的分类 按照运算符与运算对象的关系 单目表达式 双目表达式 三目表达式,64,12.运算符与表达式,表达式 表达式的分类 按照运算符在表达式中的作用 算术表达式,例:3+4*5 赋值表达式,例:a=3 关系表达式,例:5b 逻辑表达式,例:35&a=b 条件表达式,例:ab?a:b 逗号表达式,例:a=3,b=4,c=5 指针表达式,例:p-2,&a,65,12.运算符与表达式,表达式的求值过程 C语言规定了运算符的优先级和结合性 优先级 指同一个表达式中不同运算符进行计算时的先后次序 结合性 结合性是指同一个表达式中相同优先级的多个运算应遵循的运算顺序 语言规定:单目运算符是自右向左结合,双目运算符是自左向右结合,66,表达式的求值过程按C规定的原则求值 表达式代表了一个具体的值 实际上是一个数据加工的过程 在表达式求值时,先按运算符的优先级级别的高低次序执行 如果运算符两侧的优先级级别相同,则按规定的“结合方向”处理 提示 运算符的优先级制约着表达式的计算次序 可以通过括号()来改变表达式求值的顺序 表达式求值过程中存在某种类型数据的类型转换,67,12.运算符与表达式,算术表达式 由算术运算符连接数值型运算对象构成 其结果可以是整数、单精度实数和双精度实数 例:int a=2;float b=4.5;表达式 2*a+b 的结果为8.5 优先给与结合性,68,提示 两个整数相除其结果仍为整数(即舍去小数部分)例如:13/10的结果为1“%”为求余运算符,参与运算的两个数均为整数 例如:10%31-10%3-1 除以0在计算机系统中是没有意义的 双目运算符两侧运算对象的类型必须一致,所得结果的类型将与运算对象的类型一致 用括号可以改变表达式的运算顺序,69,12.运算符与表达式,算术表达式 例1:设 int b=7;float a=2.5,c=4.7;表达式a+(int)(b/3*(int)(a+c)/2)%4的值?例2:,70,12.运算符与表达式,自增/自减“+”与“-”的作用是使变量的值增1或减1 C语言提供两种形式的+/-运算符+a,-a(前缀运算:先进行增量运算后使用)a+,a-(后缀运算:先使用后进行增量运算)提示:增和自减只能作用于变量,不允许对常量、表达式或其它进行操作 当自增/自减变量值本身就单独构成一条语句时,前缀和后缀的效果是一样的 对于“+”和“-”的使用要避免二义性,71,12.运算符与表达式,自增/自减 计算过程 例1:设x=5 y=+x;/*先计算x=x+1,再执行y=x,结果x=5,y=6*/y=x+;/*先执行y=x,再计算x=x+1,结果y=5,x=6*/问题:如何理解A+B?C规定:自左向右取尽可能多的符号组成运算符 例2:设x=5 y=x+*x+;/*先取x的值进行“*”运算,再进行两次 x+。y=25,x=7*/y=+x*+x;/*先进行两次x自增,使x的值为7,再进行相乘运算。y=49,x=7*/,72,12.运算符与表达式,赋值表达式 由赋值运算符“=”连接表达式(右侧)和变量(左侧)形式:变量名表达式 赋值运算符完成两类操作 计算 赋值 例 int a=2,float b=5.2,c;c=a*b;赋值运算符具有右结合性 例如:a=b=3*5;/*先计算3*5,后将15赋给b,再将b的值15赋给a*/,73,12.运算符与表达式,赋值表达式 组合赋值表达式 组合赋值运算符将一个变量和一个表达式连接起来的式子称为组合赋值表达式 形式:变量名 表达式 例:x%=y/3;/*x=x%(y/3)*/a*=b+c/*a=a*(b+c)*/注意:“a*=b+c”与“a=a*b+c”是不等价的 提示“=”不是数学中的“等号”,它表示一个动作 右侧的值送与左侧的变量中(左侧只允许是变量,不能是表达式或其他)赋值运算符两侧的类型要求一致,否则要进行类型转换 赋值运算符=,相等运算符=,和一般习惯有所不同,74,12.运算符与表达式,关系表达式 关系运算符中的“关系”二字的含义是指一个值与另一个值之间的关系 关系由关系运算符(,=,OP 表达式可以是常量、变量和表达式 结果为整型值 0:逻辑假 1:逻辑真 优先级:(,=,=)高于(!=,=)结合方向:自左向右,75,12.运算符与表达式,关系表达式 例:int a=2;float b=3.4;ab、a+bb,abb的结果分别是多少?(0、1、0)提示 进行关系运算时,先计算表达式的值,然后再进行关系比较运算 例如:int a=1,b=2,c=3;(1)a+b3*c 的结果为0/*39关系不成立*/(2)(a+=b)(b*=11%c)结果值为1/*34关系成立*/在表达式中连续使用关系运算符时,要注意正确表达含义 例如:设的取值范围为“-1010”时,不能写成“-10=x=10”,应写成“-10=x&x=10 为什么?,76,12.运算符与表达式,逻辑表达式“逻辑”是指连接关系的方式 由逻辑运算符(&、|、!)连接的表达式构成 形式:OP 表达式可以是常量、变量、或其他表达式 其结果为整数值 0(逻辑假)或1(逻辑真)优先级“!”最高,“&”次之,“|”最低 逻辑运算优先级低于所有关系运算“!”优先级高于所有算术运算(单目运算)结合性&、|自左向右 例如:ab&bd!自右向左(例如:!a),77,12.运算符与表达式,逻辑表达式 逻辑运算规则 提示 设计逻辑“与”运算,将最可能为“假”的表达式放在最左侧 设计逻辑“或”运算,将最可能为“真”的表达式放在最左侧,78,12.运算符与表达式,逻辑表达式 例题:,设int a=3,b=1,x=2,y=0;则(y|b)&(y|a)的运算结果为1。问题:(1)y|b&y|a 的运算结果是多少?(2)两个表达式在运算次序是否一致?,79,12.运算符与表达式,条件表达式 由条件运算符连接它的三个运算对象构成的表达式称之为条件表达式 形式:?:条件运算符的“?”个“:”总是成对出现 表达式可以是任何类型,结果也可以是任何类型 运算过程 计算表达式1的值 为真,计算表达式2的值,并将表达式2的值作为整个条件表达式的结果,不再计算表达式3的值 为假,计算表达式3的值,并将表达式3的值作为整个条件表达式的结果,不计算表达式2的值,80,12.运算符与表达式,条件表达式 优先级 高于赋值运算,但低于所有关系运算、逻辑运算和算术运算 结合性 自右向左结合 提示 当多个条件表达式嵌套使用时,每个后续的“:”总与前面最近的、没有配对的“?”相联系 例如:xy?x:zw?z:w 等同于xy?x:(zw?z:w)三个运算对象的类型可以不相同 例如:x?a:0.5,81,12.运算符与表达式,条件表达式 例题:,设 int x=10,y=9;int a,b,c;a=(-x=y+)?x:-y;b=x+;c=y;执行上述程序段后a,b,c的结果是?,分别为8,8,10,82,12.运算符与表达式,逗号表达式 由逗号连接符(,)与表达式构成 形式:,可以是任何类型 逗号表达式的结果为最后一个表达式的结果值 执行过程 先求解表达式1的值,再求解表达式2的值,最后求解表达式n的值,并将表达式n的值作为整个表达式的结果值 优先级 级别最低(最后进行逗号运算)结合方向 自左向右,83,12.运算符与表达式,逗号表达式 提示 不是出现逗号的地方都是逗号表达式,逗号在C语言中用于语句之中的参数分隔符 在多数情况下,使用逗号表达式的目的是要分别求出每个表达式的结果值 在循环结构中经常使用 例题 设int x,a;表达式x=(a=4,6*2)的x值?表达式x=a=4,6*2的x值?,x为12,x为4,84,12.运算符与表达式,混合运算 指在一个表达式中参与运算的对象不是相同的数据类型 例如:设:int a=3;float b=3.0;char c=3;则表达式(a*c+b)/4+(int)b%2的结果?进行混合运算的首要的问题是对参与运算的数据进行类型转换 类型转换 由一种数据类型到另一种数据类型的转换被称为类型转换,85,12.运算符与表达式,类型转换“隐式的”自动类型转换 如果同一个表达式中含有不同类型的常量和变量,C语言则在计算该表达式时会自动转换为同一种数据类型以便进行运算,86,转换原则 运算中将所有char型数据转换成int型,float型转换成double型“类型提升”:低类型向高类型转换 例如:1.5+2*a-1.2345678/*运算次序为:2*a:先将a转换成整型数97,得乘积194 1.5+194:1.5和194都转换成double型,和为95.5:1.2345678本身应是double型的,所以最后结果也为double型*/,87,int,char,short,unsigned,long,double,float,低,高,12.运算符和表达式,类型转换“隐式的”自动类型转换“类型提升”示意图,88,12.运算符与表达式,类型转换“隐式的”自动类型转换 转换原则 在数据输出时发生的类型转换 同样要遵守“类型提升”的原则 赋值运算中最终结果的类型,以赋值运算符左边变量的类型为准 要将赋值符号右边表达式的值按左边变量的数据类型转换之后再赋值 当左边变量的类型长度较右边值的长度短时,就可能产生误差,甚至完全错误 提示 由语言的编译系统自动完成 不会体现在语言源程序中 程序设计人员必须了解这种自动转换的规则及其结果,89,12.运算符与表达式,类型转换“显式的”类型转换 通过用强制类型转换运算符(type)进行数据类型转换 其含义是将右边表达式的值转换成括号中指定的数据类型 转换形式如下:(type)表达式 type表示一个强制数据类型名 表达式是任何一种类型的表达式 例(int)(x+y)/*注意与(int)x+y不同*/提示 通过强制类型转换,只得到了一个所需类型的中间变量,原变量或表达式的值并没有变化 例 设:int a;float x;如果:x=8.57;a=(int)x;/*结果a=8,x仍为float型,其值仍为8.57*/,90,13.简单表达式的运算,【例1】执行下面程序段后,int a=1,b=1,c=1;a=a+b+c+;printf(“%d,%d,%d”,a,+b,c+);输出结果为:A.4,3,2;B.3,3,2;C.3,3,3;D.3,2,2;,【例2】若定义x,y为double型,则表达式x=1,y=x+3/2的值是?,【例3】若变量已经定义并赋值,下面符合C语言语法的表达式是:A)a:=b+1 B)a=b=c+2 C)int 18.5%3 D)a=a+7=c+b,【例4】若a为int类型,且值为3,则执行完表达式a+=a-=a*a后,a的值是多少?A)-3 B)9 C)-12 D)6,91,13.简单表达式的运算,【例5】分析下列运算的结果。#define printt(x,y,z)printf(x=%d,y=%d,z=%dn,x,y,z)main()int x,y,z;x=y=z=2;+x|+y,/*定义宏替换*/,/*输出:x=3,y=2,z=2*/,/*+x&+y后不为,不再执行|后的+z 输出结果:x=3,y=3,z=2*/,?,?,/*输出:x=-1,y=-2,z=-2*/,