最简单的C程序设计——顺序程序设计A_第1页
最简单的C程序设计——顺序程序设计A_第2页
最简单的C程序设计——顺序程序设计A_第3页
最简单的C程序设计——顺序程序设计A_第4页
最简单的C程序设计——顺序程序设计A_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

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

文档简介

1、1第3章 最简单的C程序设计顺序程序设计( PART A )zxl.xmu.20142目 录3.1 顺序程序设计举例3.2 数据的表现形式及其运算zxl.xmu.2014怎样才能学会编写C语言程序?1. 要有正确的,即学会设计算法;2. 掌握,知道怎样使用C语言所提供的功能编写出一个完整的、正确的程序;3. 在设计算法和编写程序时,采用。3zxl.xmu.2014(1)顺序结构AB三种基本结构及其流程图描述AB(a)传统流程图表示(b)N-S流程图表示zxl.xmu.2014(2)选择(/选取/分支)结构三种基本结构及其流程图描述(2)(a)传统流程图表示(b)N-S流程图表示pABYNpAY

2、NABYNpzxl.xmu.2014(3)循环(/重复)结构三种基本结构及其流程图描述(3)(a)传统流程图表示(b)N-S流程图表示pAYNpANY当型(While型)直到型(Until型)当当 p 成立成立A直到直到 p 成立成立Azxl.xmu.2014三种基本结构的共同特点(1) 只有一个入口只有一个入口(2) 只有一个出口只有一个出口(3) 结构内的每一部分都有机会被执行到。结构内的每一部分都有机会被执行到。也就是说,对每一个框来说,都应当有一条从入口到出口的路径通过它(4) 结构内不存在结构内不存在“死循环死循环” 不存在无规律的转向,只在结构内部允许分支和跳转。 可根据需要构造其

3、它满足上述特点的基本结构(如:多分支选择结构) 用上述三种基本结构组成的算法结构,可以解决任何复杂的问题。83.1 顺序程序设计举例顺序程序设计举例zxl.xmu.2014【例3.1】 有人用温度计测量出用华氏法表示的温度(如64 F),今要求把它转换为以摄氏法表示的温度(如17.8 C)。【解题思路解题思路】找到找到二者间的转换公式二者间的转换公式)32(95fcf代表华氏温度代表华氏温度,c代表摄氏温度代表摄氏温度zxl.xmu.2014【例3.1】 有人用温度计测量出用华氏法表示的温度(如64 F),今要求把它转换为以摄氏法表示的温度(如17.8 C)。【算法算法】N-S图输入输入f f

4、的值的值输出输出c c的值的值)32(95fczxl.xmu.2014)32(95f#include #include intint main ( ) main ( ) float float f,cf,c; ; f=64.0; f=64.0; c=(5.0/9) c=(5.0/9)* *(f-32); (f-32); printfprintf(f=%f(f=%fncnc=%f=%fn,f,cn,f,c); ); return 0; return 0; 定义定义f和和c为单精度浮点型变量为单精度浮点型变量指定指定f的值的值计算计算c的值的值输出输出f和和c的的值值【例3.1】程序zxl.xmu

5、.2014【例3.2】计算存款利息。有1000元,想存一年。有三种方法可选:(1)活期,年利率为r1;(2)一年期定期,年利率为r2;(3)存两次半年定期,年利率为r3。请分别计算出一年后按三种方法所得到的本息和。【解题思路】确定计算本息和的公式。若存款额为p0,则: 活期存款一年后本息和为 p1=p0(1+r1) 一年期定期存款,一年后本息和为 p2=p0(1+r2) 两次半年定期存款,一年后本息和为) 23+)(123+p0(1=p3rrzxl.xmu.2014【例3.2】计算存款利息。有1000元,想存一年。有三种方法可选:(1)活期,年利率为r1;(2)一年期定期,年利率为r2;(3)

6、存两次半年定期,年利率为r3。请分别计算出一年后按三种方法所得到的本息和。【算法】N-S图:输入输入p0,r1,r2,r3的值的值计算计算p1=p0(1+r1)计算计算p2=p0(1+r2)计算计算p3=p0(1+ )(1+ )输出输出p1,p2,p323r23rzxl.xmu.2014#include int main ( ) float p0=1000, r1=0.0036,r2=0.0225, r3=0.0198, p1, p2, p3; p1 = p0 * (1 + r1); p2 = p0 * (1 + r2); p3 = p0 * (1 + r3/2) * (1 + r3/2);

7、printf(”%fn%fn%fn”,p1, p2, p3); return 0; 定义变量定义变量同时同时赋予初值赋予初值【例3.2】程序153.2 数据的表现形式数据的表现形式及其运算及其运算基本概念常量与变量标识符数据类型补充:匈牙利命名法、驼峰命名法等命名规范*16zxl.xmu.2014基本概念 常量与变量 常量常量(constant)(constant)在程序运行过程中,其值不能被改变的量。 在编写程序时直接明确写出值,且该值在程序运行时不能或者无需改变。 变量变量(variable) (variable) 内存中一个有名字的特定存储单元(若干个连续字节),用来存放数据,在程序运行

8、过程中,其值可以改变。 通常用来存放在编写程序时值未知或者不能确定(在程序运行时由用户输入或实时求得)的数据。1.1. 变量名变量名 存储地址2. 内存中的一块连续存储空间3.3. 变量值变量值 存放的数据值50a206D变量值变量值变量名变量名存储单元存储单元变量的地址变量的地址zxl.xmu.201418基本概念 标识符 标识符标识符(identifier) (identifier) 在高级语言中,用来对变量、符号常量、函数、数组、数据类型等命名的有效字符序列。 标识符就是一个对象的名字。 C语言规定标识符只能由字母、数字和下划线三只能由字母、数字和下划线三种字符组成,且第一个字符必须为字

9、母或下划种字符组成,且第一个字符必须为字母或下划线线。例 合法标识符:day,_1_2,B_3d 非法字符举例:M.D.John,$123,1AB,d ezxl.xmu.201419标识符的长度 ANSI中没有规定标识符的长度(字符个数),但各个C编译系统都有自己的规定,如:IBM PC的MS C限制标识符长度为8,而Turbo C则允许32个字符。 当程序中的标识符超过规定限制,则超过的部分将超过的部分将被截去被截去,却不产生编译或连接错误,于是就可能出现难以发现的逻辑错误。例 IBM PC的MS C中,student_name与student_num将被认为是同一个变量名。 为了程序的可移

10、植性和可读性,建议变量名不要超过8个字符!zxl.xmu.201420标识符的使用C是大小写敏感大小写敏感的语言,即在C语言中大写字母和小写字母被认为是两个不同的字符。如:Student、student与STUDENT 通常,变量名用小写字母变量名用小写字母,而字符常量名用大字符常量名用大写字母写字母。选择标识符时,一定要注意能做到“见名知意”,以便增加程序的可读性。 书中的一些例子使用单个字符作为变量名,主要是为了举例方便,在实际编程开发中应避免使用!注意,不能与关键字关键字(参见附录C)同名!xlzhengxmu,201321附:关键字+关键字/保留字 C语言程序中有特殊含义的英文单词,主

11、要用于构成语句、定义存储类型和数据类型。 C语言中仅有37个关键字autobreakcasecharcontinueconstdefaultdodoubleelseenumexternfloatforgotoinlineintiflongregisterreturnrestrictshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile_bool_Complex_Imaginaryzxl.xmu.2014基本概念 数据类型【C C语言规定语言规定】 程序中所使用的每个变量都必须在使用之前先给出定义程序中所使

12、用的每个变量都必须在使用之前先给出定义(“”);); 变量定义语句的形式变量定义语句的形式: , ,2,n;例如:例如: intint a,ba,b; ; float p0=1000, r1=0.0036;float p0=1000, r1=0.0036; 在定义所有的变量时都要指定变量的类型;在定义所有的变量时都要指定变量的类型; 常量也是区分类型的。常量也是区分类型的。为什么必须指定数据的类型?为什么必须指定数据的类型? 在计算机中,数据时存放在存储单元中的,而存储单元是由有限的在计算机中,数据时存放在存储单元中的,而存储单元是由有限的字节构成的,因此每一个存储单元中存放的数据的范围是有限

13、的。字节构成的,因此每一个存储单元中存放的数据的范围是有限的。 计算机中的数据:有限的、离散的、近似的计算机中的数据:有限的、离散的、近似的22zxl.xmu.2014基本概念 数据类型(2) 数据类型数据类型(data type)(data type):高级语言中对不同类:高级语言中对不同类型的数据存放单元的安排(规定),包括型的数据存放单元的安排(规定),包括存储单存储单元的长度元的长度(占多少字节)以及(占多少字节)以及数据的存储形式数据的存储形式。 数据类型规定了该类型数据的所有可能数据类型规定了该类型数据的所有可能取值范围取值范围,以及,以及在这些值上允许进行的操作。在这些值上允许进

14、行的操作。 也就是说,数据类型是一个值的集合和定义在这个也就是说,数据类型是一个值的集合和定义在这个值集值集上的上的一组操作一组操作的总称。的总称。23zxl.xmu.2014 基本整型 短整型长整形基本类型整型双长整型*字符型布尔型*单精度浮点型浮点型双精度浮点型数据类型复数浮点型枚举类型(9)空类型指针类型(8) 数组类型(6)派生类型结构体类型(9)共用体类型(9)函数类型(7)24C语言的数据类型算算 术术 类类 型型纯量类型纯量类型组合类型组合类型有*的是C99所增加的。(P43 图3.4)常量整型常量、实型常量字符常量字符串常量符号常量常变量25zxl.xmu.201426常量的分

15、类常量常量/常数常数 在程序运行过程中,其值不能被改变的量。 程序中直接明确给出值,且该值在程序运行时不能或者无需改变。常量的分类常量的分类 按数据类型分:整型整型、实型实型、字符字符、字符串字符串 常量的数据类型无需事先说明,系统从其书写形式即可判定其类型。 按定义和使用方式分: 字面常量字面常量/直接常量直接常量:从其字面形式即可识别,没有名字。 符号常量符号常量:以一个标识符标识符代表一个常量,即有名字的常量。zxl.xmu.2014 整型常量整型常量:如1000,12345,0,-345 实型常量实型常量 十进制小数形式十进制小数形式:如0.34 -56.79 0.0 十进制十进制指数

16、指数形式形式:如12.34e3 (代表12.34103) E E或或e e之前必须有数字,之后必须为整数之前必须有数字,之后必须为整数 字符常量字符常量:如? 转义字符转义字符:如n 字符串常量字符串常量:如”boy” 符号常量符号常量:#define PI 3.1416不同类型的常量举例zxl.xmu.201428字符常量C中,字符常量字符常量是用单引号单引号括起来的一个或多个字符一个或多个字符,其中字符可为普通字符,也可为转义字符。转义字符转义字符是以“ ”开头的特殊字符。有些字符属于不可见字符不可见字符,无法直接写出,如:回车和tab;有些字符直接写出会引起歧义,如:”和 一个转义字符仅

17、仅算一个字符一个转义字符仅仅算一个字符,尽管其表现形式是两个(或多个)字符。zxl.xmu.201429字符常量(2)字符含义 ASCII值 字符含义 ASCII值n换行10反斜杠字符92t水平制表符9单引号字符39b退格8”双引号字符34r回车13ddd 8进制ASCII值f换页12xhh 16进制ASCII值a声音或视觉信号?问号字符63v垂直制表符11 n是跳到下一行的开头,而r是跳到本行的开头 t不是水平右跳固定空格,而是水平跳到固定位置(8列为一制表区); b仅仅是位置的移动,本身不作删除 ddd和xhh的位数限制其取值范围为ASCII字符(P40 表3.1)zxl.xmu.2014

18、30字符常量(3)【例1】 main() printf(“abctderftgn”); printf(“htibbjk”); 屏幕上最后看到的结果(替换/覆盖)为:fgdehjk 打印机上输出结果(叠加)为:fabcgdehjikzxl.xmu.201431字符串常量C中的字符串常量字符串常量是用一对双引号双引号括起来的字符序列字符序列。如: ”12.3”, ”a”, ”a=a+b”, ”/12” 注意,不要将字符常量与字符串常量混淆!注意,不要将字符常量与字符串常量混淆! C C中规定,在每一个字符串的结尾加上一个中规定,在每一个字符串的结尾加上一个字符字符串结束标志串结束标志( 0 0)。

19、写字符串时,自动添加。)。写字符串时,自动添加。 a和”a”的差别:”a”事实上是两个字符: a和0。 C C中没有中没有专门的专门的字符串型变量字符串型变量(与Basic、Pascal、C+等不同),要将一个字符串保存到变量中,必须使用字符数组字符数组(6)。zxl.xmu.201432符号常量符号常量符号常量一个用标识符标识符来代表的常量,即以标识符形式出现的常量。 符号常量的定义格式(预处理命令):# define # define 符号常量的定义必须单独占一行,其后无须跟逗号 通常放在程序开头zxl.xmu.201433宏定义命令宏定义命令符号常量的使用示例【例2】#include #

20、define PRICE 30void main ( ) int num, total; num=10; total = num * PRICE; printf(total = %d, total);此处不能加“;”否则可能造成语法错误zxl.xmu.201434符号常量(3) 使用符号常量的好处1. 使用“见名知意”的符号常量名可提高程序的可读性如:area=PI*r*r 与 area=3.14*r*r2. 在需要改变一个常量时,能做到“一改全改” 只是一个临时符号,预编译后这个符号就不存在了!不是变量不可赋值! 习惯上,符号常量名用大写,变量用小写,以示区别。zxl.xmu.201435常

21、变量定义语句形式:c constonst = = ;例:例: constconst intint a = 3 a = 3;【常变量与变量的异同】 相同点:有类型、占存储单元 不同点:在其存在期间不允许改变其值!【常变量与常量的异同】常变量是有名字的不变量,常量是没有名字的不变量。 有名字便于程序中被引用。符号常量是有名字的不变量zxl.xmu.201436常变量(2)【常变量与符号常量的异同】符号常量是用预处理命令(预编译指令)定义的,只是用符号来代表一个字符串;在预编译时仅仅进行字符替换;在预编译后,符号常量就不存在了!有类型、占存储单元,只是在其存在期间不允许改变其值!常变量具有符号常量的

22、优点,而且使用更方便,在使用中可替代符号常量。数据类型整型数据字符型数据浮点型数据常量的数据类型37整型数据38zxl.xmu.201439整型数据的存储方式整型数据以二进制形式存储,占2B或4B或8B。整型数值以补码表示存储:正数的补码:与其原码形式相同。负数的补码:其绝对值的原码按位取反再加1。例 83的补码表示(2B,即16位)83的原码0000000001010011按位取反1111111110101100加11111111110101101最高位为符号位,0表示该数为正,否则为负。 不同的编译系统为整型数据分配的字节数不相同!有符号有符号数!数!zxl.xmu.2014最基本的整型类

23、型 有符号基本整型:signed int基本整型16bit-3276832767 无符号基本整型:unsigned int16bit 065535整整有符号短整型:signed short int短整型 16bit -3276832767 无符号短整型:unsigned short int型型 16bit 065535 有符号长整型:signed long int长整型 32bit -21474836482147483647 无符号长整型:unsigned long int 32bit 04294967295 有符号双长型:signed long long int双长整型* 64bit-263

24、(263-1) 无符号双长型:unsigned long long int64bit0(264-1)(C标准的最小取值范围)C标准规定:sizeof(short)sizeof(int) sizeof(long) sizeof(long long)(P45 表3.2)zxl.xmu.201441整型的相关说明 既不指定为signed也不指定为unsigned时,系统默认为signed。 signed类型的存贮单元中最高位为符号位, 0为正,1为负。 unsigned类型只能存放不带符号的整数,即非负整数。 C标准中没有具体规定各类数据所占内存字节数,只要求long型数据不短于int型,short

25、型不长于int型。 在不同软硬件平台中移植程序时,需要特别注意数据长度上的区别!zxl.xmu.201442整型变量的定义【例3】#include main ( ) int a,b,c,d; unsigned u; a=12; b=-24; u=10; c=a+u; d=b+u; printf(a=%d, b=%d, u=%un,a,b,u); printf(a+u=%d, b+u=%dn,c,d); 变量的定义一般放在一个函数开头的声明部分; 也可放在函数中某一段分程序的最开头;注意:这注意:这些划线部分些划线部分将发生自动类型转换将发生自动类型转换无符号整型数据的格式输出用无符号整型数据的

26、格式输出用“%u%u”zxl.xmu.201443整型数据的溢出溢出溢出 某个数值超出了该类型数据的取值范围某个数值超出了该类型数据的取值范围例 以int为例:327670111111111111111 00000000000000000 -11111111111111111-327671000000000000001 -327681000000000000000 C C语言的用法比较灵活,当整型数发生溢出时,语言的用法比较灵活,当整型数发生溢出时,C C系统自动取系统自动取模,并不报错模,并不报错! ! 出现此种问题往往要靠程序员的细心和经验来保证程序结果的正确。出现此种问题往往要靠程序员的

27、细心和经验来保证程序结果的正确。zxl.xmu.2014整型数据的溢出(2) 将一个负值赋予一个无符号整型变量,也会产生问题!【例4】unsigned short price = -1;printf(%dn, price);输出:65535Why?-1的补码:11111111 11111111存入无符号短整数变量price后,第一位不再代表符号位!44字符型数据45zxl.xmu.201446C语言的基本字符集构成C语言程序的基本字符包括:1. 数字字符:092. 大小写拉丁字母:az, AZ3. 其他字符: 一些特殊字符,具体有:+ - * / = , . _ : ; ? | ! # % &

28、 ( ) (空格) 其他可打印(可显示)的字符,如汉字等自然语言符号(作为字符串的内容)注意 C/C+语言是区分大小的语言 ! (详见P377 附录B)zxl.xmu.201447字符型数据的存储方式 字符数据并不是存储字符本身,而是存储字符所对应的存储字符所对应的ASCIIASCII值值,其存储形式和整型类似,故C99将字符型数据作为整数类型的一种。C中,字符型数据和整型数据可通用。字符数据可以字符形式输出,也可以整数形式输出。字符数据与整型数据可以相互赋值。例5main ( ) char c1,c2; c1=97; c2=b; printf(c1=%c c2=%cn,c1,c2); pri

29、ntf(c1=%d c2=%dn,c1,c2);zxl.xmu.201448字符型数据类型 有些系统(包括TC、VC)中,字符变量中最高位作为符号位,这样就有了符号字符型(符号字符型(signed charsigned char)和无无符号符号字符型(字符型(unsigned charunsigned char)的差别。signed char -128127unsigned char 0255 C标准未规定只出现char,是按signed char处理还是按unsigned char处理,各个编译器自己决定。 例如“char c = 255;”在VC编译时会有警告,而改为“unsigned c

30、har c = 255;”则无警告,说明VC默认将char作为signed char类型。 这样的字符存储模式,有利于对字符数据进行处理(可直接对ASCII码进行处理,如实现大小写转换 ,P55例3.3) 常用的ASCII码:A(65),a(97),0(48),(32)zxl.xmu.201449【辨析】 数字字符与数字数字字符与数字【例】1 和 1 字符型数据与标识符字符型数据与标识符【例】x 和 x x是一个标识符,可以用来命名程序中的某个对象,如变量、函数、数据类型等等; x是一个字符型常量。常量类别 数据类型 机内存储形式数据长度1整型int整数1的二进制编码 2B或4B1 字符型ch

31、ar字符1的ASCII码(二进制形式)1B浮点型数据50zxl.xmu.201451浮点型型数据的存储方式 浮点型数据是按规范化的指数形式规范化的指数形式存储的。 把一个浮点型数据分成小数部分小数部分(含符号位)和指数部指数部分分(含符号位),形如N=R10J 规范化规范化的指数形式的指数形式 小数部分中小数点前的数字为小数部分中小数点前的数字为0 0、小数点后第小数点后第1 1位数字不为位数字不为0 0的指数形式的指数形式,如:0.123e5 计算机中,以二进制数来表示小数部分,用以二进制数来表示小数部分,用2 2的幂次来的幂次来表示指数部分表示指数部分。 一般表示形式:N=S2J其中,S为

32、N的小数部分,J为指数,2为J的基数 C标准并未具体规定各部分所占的位数,由各C编译系统自定; 小数部分占的位数愈多,数的有效数字愈多;指数部分占得位数愈多,所能表示的数值范围愈大。数符小数部分 指数zxl.xmu.201452浮点型数据的类型微机上常用的C编译系统(如Turbo C,Visual C)的情况:类型 字节数 有效数字数值范围Float 4 6 (3.410-383.41038)double 8 15 (1.710-3081.710308)long double 8 15 (1.710-3081.710308) 16 19 (3.410-49323.4104932) C标准未具体

33、规定每种类型数据的长度、精度和数值范围,不同的系统有所差异。 使用不同编译系统时请注意其差别!zxl.xmu.201453浮点型数据的舍入误差 由于浮点型变量的存储单元有限,因此能提供的有效数字有效数字总是有限的总是有限的,在有效位以外的数字将被舍去有效位以外的数字将被舍去,由此可能产生一些误差误差。例6main() float a=123456.789e5, b; b=a+20; printf(a=%fnb=%fn,a,b); 应当避免将一个很大的数和一个很小的数直接相加或相减,否则就会“丢失”小的数。例7main() printf(%f,1.0/3.0*3);常量的数据类型54常量同样也要

34、放在存储单元中,也涉及存储方式问题。 常量主要根据其表示形式来判断类型zxl.xmu.201455整型常量的类型 不带小数点的数值是整型常量不带小数点的数值是整型常量,系统依据int、long int和long long的取值范围,自动判定。如:5224为int,而500000为long int 欲强制说明某一整常量为长整型强制说明某一整常量为长整型,可在其后加上在其后加上l l或或L L,如:123l、0L等。zxl.xmu.201456整型常量的表示形式在C中,整型常量有三种表示形式:(1)十进制整数十进制整数:即通常的整数表示法(2)八进制整数八进制整数:以0开头例 0123 = 1*8

35、2 + 2*81 + 3*80 = 83017 = ( 1*81 + 7*80 ) = 15经常被混淆,要特别注意!(3)十六进制整数十六进制整数:以0 x开头 例0 x123 = 1*162 + 2*161 + 3*160 = 291 0 x17 = ( 1*161 + 7*160 ) = 23正整数前面的“”经常被省略。zxl.xmu.201457浮点型常量的表示形式凡以小数形式或指数形式出现的实数都是浮点型常量以小数形式或指数形式出现的实数都是浮点型常量,都按双精度双精度处理,在内存中均以规范化的指数形式存储。在C中,浮点型常量有两种表示形式:(1)十进制小数十进制小数:由数字和小数点组

36、成小数点必须有,如:0与0.0的区别纯小数可省略整数部分,如:.123(2)指数形式指数形式:类似于科学记数法e或E前(后)必须有数字,其后必须为整数。例 合法形式:123e3,123E3,-.3E-4,0E+0非法形式:e3,12E3.2,.e2,e,1ezxl.xmu.201458浮点型常量的类型 通常,系统将浮点型常量都作为双精度来处理将浮点型常量都作为双精度来处理,这样可以保证计算结果更精确,但是运算速度降低了。 在数的后面加字母在数的后面加字母f f或或F F,编译系统将其按单精度处理,编译系统将其按单精度处理。 在数的后面加在数的后面加字母字母l l或或L L,编译系统将其编译系统

37、将其按按long doublelong double类类型处理型处理。 一个浮点型常量可赋给一个float型/double型/long double型变量,系统将根据类型截取相应的有效位数字。例8main ( ) float a; a=111111.111;/只接受7位有效数字 printf(“a=%fn, a);zxl.xmu.2014【辨别】区分类型与变量【例】int a; a=3;/正确。int =3 ;/错误!不能对类型赋值 变量是存储空间中一块有名字的存储单元,用于存储数据,是内存中具体存在的实体; 每个变量在定义时都必须指定一个明确的类型,类型是变量的一个重要属性。 类型是对同一类

38、型数据的存储实现方案,包括存储单元的长度(占多少字节)以及数据的存储形式。 不同高级语言中定义的数据类型可能有所不同。 类型是抽象的,不占用存储单元,不能用来存放数据。59zxl.xmu.201460变量赋初值程序中经常要对一些变量预先设置初值,使用未赋值使用未赋值的变量往往是危险的的变量往往是危险的。C语言允许在定义变量的同时使变量初始化。如,int a=3; 或者 int a,b,c=5; 这将使得程序更为简洁。相当于一个赋值语句。如,int a=3; 相当于 int a; a=3;【错例】: int a=b=c=3; 初始化不是在编译阶段完成的(静态变量和外部变量除外,参见7),通常是在

39、程序运行执行到本函数时才赋予初值的。注意:这里只有注意:这里只有c c被赋了初始值!被赋了初始值!运算符和表达式C运算符基本的算术运算符自增、自减运算符算术表达式和运算符的优先级与结合性不同类型数据间的混合运算强制类型转换运算符61C运算符62zxl.xmu.201463C运算符简介 C语言的运算符范围很宽,涉及多种基本操作。主要有以下13类(34种):1、算术+、*、/、%(模)2、关系、=、=、!=3、逻辑!、&、|4、位、|、&5、赋值=及其扩展赋值运算符6、条件_?_ :_ 7、逗号,8、指针*、&9、求字节sizeof( )10、强制类型转换(类型)zxl.xmu.201464C运算

40、符简介(2)11、成员_ ._ _12、下标 13、其他如:函数调用运算符() 目目/ /元元运算时所需运算对象(操作数操作数)的个数。 优先级优先级表达式中多个不同运算符之间的运算先后顺序。 结合性结合性表达式中多个相同优先级的运算符之间的运算优先顺序。zxl.xmu.201465基本算术运算符+加法运算符减法运算符正值运算符(单目) 负值运算符(单目)*乘法运算法除法运算符% 模运算符/求余运算符【说明】单目运算符,如: 3、+3% 运算符要求参加运算的运算对象(即操作数)为整数,结果也是整数。如8%3,结果为2,又如:23%12值为11。当至少有一个数为负值时,不同的系统有所差异!两两个

41、整数相除的结果为个整数相除的结果为整数,整数,如5/3的结果值为,舍去小数部分。zxl.xmu.201466基本算术运算符(2)如果除数或被除数中有一个为负值,舍入方向不固定。 如:5/3值为1, 5/3值为1或2(因系统而异!)例9 main ( ) printf( 5 / 3 = ); printf(%dn, 5/3); printf( 5 / -3 = ); printf(%dn, 5/-3); printf(-5 / 3 = ); printf(%dn, -5/3); printf(-5 / -3 = ); printf(%dn, -5/-3);+、 、*、/的操作数可以是任何算术类型

42、,若有一个为实数,均自动转换为double型进行计算。多数C编译系统采取“向零取整”,如VC。zxl.xmu.201467算术表达式和运算符的优先级与结合性算术表达式算术表达式 用算术运算符和括号将运算对象(也称操作数,含常量、变量、函数等)连接起来的、符合C语法规则的式子。 算术运算符的优先次序: +、(单目) *、/、% +、 C规定了各种运算符的结合方向结合方向/ /结合性(双目)算术运算符的结合方向为“自左至右”(又称“左结合性左结合性”),即运算对象先与左面的运算符结合。单目运算符、赋值运算符等为右结合性。 先考虑优先级再考虑结合性;结合性仅在同级运算符中发生作用。 (参见附录D)z

43、xl.xmu.201468自增、自减运算符+使变量的值增使变量的值增1 1 - -使变量的值减使变量的值减1 1 例例 intint i i=3, j; j=+=3, j; j=+i i; ; intint i i=3, j; j=3, j; j=i i+;+; +i i 与与 i i+(- -i i与与i i- -)的区别:前者先执行增(减)运算)的区别:前者先执行增(减)运算再返回变量值,后者反之。再返回变量值,后者反之。 自增、自减运算符自增、自减运算符只能用于变量只能用于变量,而不能用于常量或表达,而不能用于常量或表达式。式。错例:错例:5+5+,a a+,( (a+ba+b)+)+

44、自增、自减运算符的结合方向是自增、自减运算符的结合方向是“自右至左自右至左”,优先于算,优先于算术运算符,与强制类型转换符和负号运算符号同级。术运算符,与强制类型转换符和负号运算符号同级。 例例 - -i i+ + 等价于等价于 -( -(i i+)+) 常用于循环语句、指针变量中,原因是:简洁、高效。常用于循环语句、指针变量中,原因是:简洁、高效。结果:j=4, i=4结果:j=3, i=4zxl.xmu.201469算术运算和算术表达式的一些问题的说明 C C标准标准并没有并没有具体规定表达式中的子表达式的求值顺序!具体规定表达式中的子表达式的求值顺序!例 (i+)+(i+)+(i+)VC

45、中,若i的初始值为1,则表达式值为6,i为4。 避免采用容易产生歧义的写法,可增加一些的括号!例 i+j 等价于 (i+)+j,而不是 i+(+j)-i 等价于 -(-i),而不是-(-i) 运算符组合时,C编译系统在处理时尽可能多地(自左尽可能多地(自左而右)将若干字符组成一个运算符而右)将若干字符组成一个运算符。zxl.xmu.201470算术运算和算术表达式的一些问题的说明(2) 在调用函数时,对于实参的求值顺序,对于实参的求值顺序,C C标准并没有统一标准并没有统一的规定的规定。例 若i3,则printf(%d, %d, i, i+);有的系统中从左到右求值,输出3,3多数系统输出4,

46、3。(因为多数系统中的参数传递顺序是从右到左的)最好改写为:j=i+; printf(%d, %d, i, j); 不要不要写出别人看不懂的、也不知道系统将怎样执写出别人看不懂的、也不知道系统将怎样执行的程序!行的程序! 应当知道使用C语言时(尤其是在不同的C编译系统上)可能出问题的地方,以免遇到问题时不知其所以然。zxl.xmu.201471各类数值型数据间的混合运算 整型、实型、字符型数据间可混合运算。运算时,系统自动先将不同类型数据转换为同类型,再进行运算:doublefloat高 long unsigned低 intchar,short 横向向左的箭头表示必定的转换; 纵向箭头表示当运

47、算对象为不同类型时转换的方向 转换将是一步到位的!zxl.xmu.201472各类数值型数据间的混合运算(2)例 若有 int i; float f; double d; long e; 则10+ a +i*fd/e运算次序为:1、10+a:a转换为97(int),结果为107。2、i*f:i和f转换为double,结果为double3、10+a+i*f:将107转换为double,结果为double4、d/e:e转换为double,结果为double5、10+a+i*f d/e:无转换,结果为double。zxl.xmu.201473强制类型转换运算符可利用强制类型转换符将一个表达式转换为所需类型,一般形式:(类型名)(表达式) 两种类型转换:1)自动类型转换:运算时由系统自动进行2)强制类型转换:(a)当自动类型转换不能实现目的时,可以用强制类型转换。如:若有float f; 则 printf(%dn,f%3); 违反C的语法规则! 应为 printf(%dn,(int)f%3);详见mc3_10.c zxl.xmu.201474强制类型转换运算符(2)(

温馨提示

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

评论

0/150

提交评论