CH02数据类型、运算符和表达式.ppt_第1页
CH02数据类型、运算符和表达式.ppt_第2页
CH02数据类型、运算符和表达式.ppt_第3页
CH02数据类型、运算符和表达式.ppt_第4页
CH02数据类型、运算符和表达式.ppt_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设 计 王磊王磊 (博士) 经济信息工程学院 第二章:数据类型、运算符和表 达式 v2.1 简单简单 的C程序例子 v2.2 C程序的常见见符号 v2.3 数据类类型 v2.4 常量 v2.5 变变量 v2.6 常用的运算符和表达式 v2.7 赋值赋值 和表达式中的类类型转换转换 2.1:一个简单的C程序例子 #include /*函数功能:计算两个整数相加之和 入口参数:整型数据a和b 返回值: 整型数a和b之和 */ int Add(int a, int b) return (a + b); /*主函数*/ main() int x, y, sum = 0; printf(“Input two integers:“); scanf(“%d%d“, /*输入两个整型数x和y*/ sum = Add(x, y); /*调用函数Add计算x和y相加之和*/ printf(“sum = %dn“, sum); /*输出x和y相加之和*/ 并列的两个函数并列的两个函数 其中一个是其中一个是 程序的入口程序的入口 程序注释程序注释 2.2 C程序常见符号分类 (词) v 关键字(Keyword) 又称保留字,C语言中预先规定的具有固定含义的一些单词 数据类型修饰符int,控制语句return等 v 标识符(Identifier):为可改变值的对象的名字 系统预定义标识符(函数名):main, printf 等 用户自定义标识符(函数名、变量名):Add, x, y等 v 运算符(Operator):34种,详见附录A v 分隔符(Separator):空格、回车/换行、逗号等 v 其它符号 大花括号“”和“”通常用于标识函数体或一个语句块 “/*”和“*/”是程序注释所需的定界符 v 数据(Data) 变量(Variable) 常量(Constant) 32个关键字:(由系统定义,不能重作其它定义由系统定义,不能重作其它定义) ) auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef unsigned union void volatile while 标识符命名 标识符:变量名,函数名 v 由英文字母、数字和下划线组成,大小写敏感 v 不可以是数字开头 v 直观,见名知意,便于记忆和阅读 最好使用英文单词或其组合 切忌使用汉语拼音 v 下划线和大小写通常用来增强可读性 variablename variable_name variableName v 不允许使用关键字作为标识符的名字 int, float, for, while, if等 v 某些功能的变量采用习惯命名 如:for语句所采用的循环变量习惯用i, j, k Windows Windows 风格风格 UNIX UNIX 风格风格 练习:练习:P46, P46, 习题习题2.12.1 34种运算符: 算术运算符:+ - * / % + - 关系运算符: = != 逻辑运算符:! a=32767; b=a+1; printf(“%d,%dn”,a,b); 说明:说明:数值值是以补码补码 表示的。一个int型变变量只能容纳纳 -3276832767范围围内的数,无法表示大于32767或小于- 32768的数。遇此情况就发发生“溢出”。 运行结果: 32767,-32768 类型溢出的解决方案? v解决方案: 预先估算运算结果的可能范围,采用取值范 围更大的类型。 1+2+3+ 1!+2!+3!+ 13+23+33+ 如果不需要处理负数,则采用无符号类型。 在运算还没开始之前就判断运算数是否在合理的 取值范围内。如果超出,则停止运算,转错误处 理。 2.4 常量 v常量是一种在程序中保持固定类类型和固定值值的数 据。 整型常量 实型常量 字符常量 字符串常量 宏常量 整型常量 v1. 整型常量的表现现形式 C语言提供了三种形式,编译器在编译 阶段自动将它们转换成二进制。 十进制 如: 256, 308, 120等 八进制 以数字0开头表示的整数 例:0235, 0146, 012等. 十六进制 以“0x”开头的整型数(数字0,字母x) 如: 0x16, 0x28 v2. 带带确定类类型的整型常量 整型常量默认地按signed int(或int)处理。 长整型(long int)常量: 123l、123L、123456l、123456L 无符号整型(unsigned int)常量: 123u、 123U 整型常量 实型常量 v1. 实实型(浮点)型常量的表示形式 十进制小数形式 123.45、456.78 指数形式 1e-2、4.5e3 注意:字母e(或E)之前必须有数字,且e后面的指数必须为整数. v 2. 带带确定类类型的实实型常量 实型常量默认地按“双精度double型”处理 也可以指定,“单精度float型”常量,例如 1.25F, 1.24e-2f 浮点型数据在内存中的存放 float型浮点型数据一般在内存中占用4个字节。 浮点型数据在内存中按指数形式存储。 指数符号指数小数符号纯小数 阶码 符号阶码 的数值尾数符号尾数的数值 阶码 j尾数 S 任意二进制浮点数N均写成: N=S2N=S2 j j p 阶码所占的位数决定实数的取值范围; p 尾数所占的位数决定实数的精度; p 不同的C编译器系统分配给阶码和尾数的存储空间大小 是不同的。 思考:二进制浮点型数的怎么表示?如何在十进制小 数和二进制小数之间进行转换? 例如: (0.3)10 (0.0100110011001100)2 实型常量 v浮点数的表示范围围和有效数字 字符(Character)常量 v字符常量的表示方法 a,A,5,%,$ 单引号内只能有一个字符,除非是转义字符 注意:5和整数5的区别 每个字符具有一个0255之间的数值,可从ASCII表查出 可以看成一个特殊的整数,也可以参与各种数学运算 字符常量在内存中,以其ASCII码形式存储。 v用“”开头的字符为转义字符 例如,n,代表1个字符 常用的转义字符 字符形式 n t v b r f ddd xhh 功能 换行 横向跳格(即跳到下一个输出区) 竖向跳格 退格 回车 走纸换页 反斜杠字符“ ” 单引号(撇号)字符 1到3位8进制数所代表的字符 1到2位16进制数所代表的字符 字符串(String)常量 字符串常量是一对双撇号括起来的字符序列。 合法的字符串常量: “How do you do.”, “CHINA”, “a” ,“$123.45” 例如,可以输出一个字符串(作为函数的参数): printf(“How do you do.”); 是字符常量,“”是字符串常量,二者不同; “ ”表示空字符; 转义转义 字符也可以出现现在字符串中,例如,“How are n you”; 规定:存储时,在每一个字符串常量的结尾加一个 “字符 串结束标志”,以便系统据此判断字符串是否结束。 规定以字符作为字符串结束标志。 如:字符串常量“” ,实际实际 上在内存中是: CHINA0 它占内存单单元不是个字符,而是个字符,最后一个字符 为为。但在输输出时时不输输出。 字符串型数据 宏(Macro)常量 v宏常量 也称“符号常量” 一般形式 #define 标识符 字符串 标识符也称为 “宏名” 宏定义不是语句,而是一种编译预处理命令,因此不 能加 ;号。 在编译预处理时,把程序中出现的所有宏名替换为其 后的字符串值。也称“宏替换”。 例2.2 :计算圆的周长和面积 # #includeinclude #define PI 3.14159#define PI 3.14159 #define R 5.3#define R 5.3 mainmain()() printfprintf(“area(“area = % = %fnfn“, PI * R * R);“, PI * R * R); printfprintf(“circumference(“circumference = % = %fnfn“, 2 * PI * R);“, 2 * PI * R); area = 88.247263 circumference = 33.300854 相当于执行相当于执行 # #includeinclude mainmain()() printfprintf(“area(“area = % = %fnfn“, 3.14159 * 5.3 * “, 3.14159 * 5.3 * 5.35.3);); printfprintf(“circumference(“circumference = % = %fnfn“, 2 * 3.14159“, 2 * 3.14159 * * 5.3);5.3); 使用宏带带来的好处处: 当程序中某些常量的值值需求经经常修改时时,例如R, 直接修改 宏定义义的值值即可,而不需要在程序中逐一修改。 例2.2 :计算圆的周长和面积 # #includeinclude #define PI 3.14159;#define PI 3.14159; #define R 5.3;#define R 5.3; mainmain()() printfprintf(“area(“area = % = %fnfn“, PI * R * R);“, PI * R * R); printfprintf(“circumference(“circumference = % = %fnfn“, 2 * PI * R);“, 2 * PI * R); 相当于执行相当于执行 # #includeinclude mainmain()() printfprintf(“area(“area = % = %fnfn“, 3.14159“, 3.14159; ;*5.3*5.3; ;*5.3*5.3; ;);); printfprintf(“circumference(“circumference = % = %fnfn“, 2*3.14159“, 2*3.14159; ;* *5.35.3; ;);); 语法错误语法错误 2.5 变量 v程序执行中可以改变值的量称为变量。变量包括变 量名和变量值。 v变量名,实际上对应着一个内存中的存储单元的地 址。在对程序编译过程中,编译系统给每一个变量 名分配对应的存储单元。 从变量中取值,实际上是通过变量名找到相应的存储单 元的地址,从该存储单元中读取变量的值。 变量的值在程序运行期间,是可以改变的。 变量声明 v使用变量的基本原则 变量必须先定义,后使用 所有变量必须在第一条可执行语句前定义 v声明的顺序无关紧要 v一条声明语句可声明若干个同类型的变量 int a, b, c; float x1, x2; double p1; char c1, c2; 变量赋初值 变量赋值的方式分为两种:变量赋值的方式分为两种: 1、先说明,再赋值。如: int x, y; x=10; y=20; 2、定义变量的同时赋值。这称为变量的初始化。 如: float x=123.45; int a, b, c=10; int a=13, b=34, c=2; char c=a; 等价于 float x; x=123.45; *不能将同初值的变量赋初值时写成: int a=b=c=6; 只能: int a=6, b=6, c=6; 变量赋初值 注意事项:char型与int型之间的 关系 char型可以看成一种特殊的整数 v例2.5:小写字母转换为大写字母 # #includeinclude mainmain()() charchar chch = b; = b; printf printf(“%c, %dn“, ch, ch);(“%c, %dn“, ch, ch); chch = b - = b - 3232; ; printfprintf(“%c, %dn“, ch, ch);(“%c, %dn“, ch, ch); # #includeinclude mainmain()() charchar chch = b; = b; printf printf(“%c, %dn“, ch, ch);(“%c, %dn“, ch, ch); chch = b - = b - (a - A)(a - A) ; ; printfprintf(“%c, %dn“, ch, ch);(“%c, %dn“, ch, ch); b, 98 B, 66 b, 98 B, 66 注意事项:实型提供的有效数字位 数 例2.6 # #includeinclude mainmain()() floatfloat a; a; doubledouble b; b; a = 123456.789e4;a = 123456.789e4; b = 123456.789e4;b = 123456.789e4; printfprintf(“%fn%fn“, a, b);(“%fn%fn“, a, b); 1234567936.000000 1234567890.000000 floatfloat型数据提供型数据提供 7 7位有效数字位有效数字 doubledouble型数据提供型数据提供 1616位有效数字位有效数字 v使用不当导致舍入误差 const常量 v用const修饰定义的变量为常量 const float pi = 3.1425926; 只能在定义时赋初值,程序中不能改变。 vconst常量与宏常量相比的优点是什么? const常量有数据类型 const常量有自己的存储空间(可以通过名字访问) 某些集成化调试工具可以对const常量进行调试 各类数值型数据间的混合运算 C语言允许双精度、单精度、整型及字符数据之 间混合运算, 例如: 10+a+1.58765.1234 b 是允许的。 但有一个规则: 先自动转换成同一类型,再计算。 类型自动转换 double float 高低 图中“ ” 表示必定转换。如a + b,先转换为 int。结果为 int。 转换方法: long unsigned int char, short 即: 既使是同一种类型也按“ “转换。 图中“ ” : 表示混合运算时,均先转换为箭头所 指向的高一级数据类型后,再运算。 即,取值范围小的类型转为取值范围大的类型 。 例: 10+ a+if d /e 其中: i int f float d double e long 思考:结果为什么类型? 10+a: 转为int, 结果为int if: 转为double, 结果为double + : 转为double d /e : 转为double :转为double 则运算时,从左向右计算: 2.6 常用运算符和表达式 运算符简简介 (1)算术运算符 (+ - * / %) (2)关系运算符 ( = = | ) (5)赋值运算符 ( 及其扩展赋值运算符) (6)条件运算符 (?:) (7)逗号运算符 (,) 2.6 常用运算符和表达式 (8)指针运算符 (* 和) (9)求字节数运算符(sizeof( )) (10)强制类型转换运算符( (类型) ) (11)分量运算符(和 -) (12)下标运算符() 2.6 常用运算符和表达式 2.6.2 算术运算符和算术表达式 (1)基本的算术运算符: (加法运算符,或正值运算符,如:、) (减法运算符,或负值运算符,如:、) * (乘法运算符,如:*) (除法运算符,如:) (模运算符,或称求余运算符,两侧均应为整型数据 ,如:的值为)。 2.6.2 算术运算符和算术表达式 v关于算术术运算的几点补补充说说明: 两个整数相除,结果仍为整数。(结果为整,一 般向零靠拢)。 例如, 5/ 3 1 整数和实数运算的结果为double型。 求余运算限定参与运算的两个操作数为整数。 通常, 余数的符号和被除数的符号一致。 例如, 12%7=5, 12%(-7)=5, (-12)%7=-5 (2) 算术表达式和运算符的优先级与结合性 运算对象: 常量、变量、函数等 优先级(降低顺序): ( ), , /, %, +, 结合性: 同一优先级, 自左向右计算,为左结合性原则。 例如: 3*4/2 的计算顺序为 3*4, 再12/2; 而非 , 先4/2,再3*2 例: a b / c 1.5 + ad e 算术表达式: 用算术运行运算符和括号将运算 对象(操作数)接起来,且符合C语法规则的式子。 补充: 常用的数学函数 参见: 附录G C语语言中,常用的数学函数均在math.h文件中定义义。 因此,如果程序中使用这这些函数,需要使用 #include 课堂练习! v假设设三个float型变变量a, b, c, 请请用算术术表达式 写出一元二次方程的求根公式 。 v (-b+sqrt(b*b-4*a*c)/(2*a) v (-b-sqrt(b*b-4*a*c)/(2*a) 2.6.3 关系运算符 1. , =为同一优先级, = =, !=等为同一优先 级, 优先级低于前4种; 2. 关系运算符优先级低于算术运算符; 3.关系运算符优先级高于但高于赋值运算符= C语言提供了六种关系运算符 = = = != = = = != 优先级为: 如下图: 算术运算符 赋值运算符 关系运算符 高 低 举例: ca+b c(a+b) ab!=c (ab)!=c a= =bc a=(bc) ? 关系表达式 关系表达式的结果值规定为非0 或 0. 如: ab, b10, (a=3)(b=5) , a b , (ab)(bb)= =c 成立(1) b+cb 则ab值为1, 所以d=1. f=abc ab为1, abc为0,所以f=0. 2.6.4 逻辑运算符 a b !a !b a + + + 自增自增1 1 自减自减1 1 则: + +i, i+都会使i变为4,但有区别: +i: 先使i值+1,再使用i值; i+: 先使用i值,再使i值+1. j= +i; j=4, i=4. (i=i+1; j=i;) j=i+; j=3, i=4. (j=i; i=i+1) 同理: i, i ,均使i值1,但: i: 先使i值1,再使用i值; i : 先使用i值,再使i值1 几点注意: 1. +和 运算符只能用于变量, 不得用于常量和表达式. 2. +, ,的结合性为从右至左, 而一般算术运算符为从左 至右。如: 如 5+ +, (a+b)+ + 均为不合法. i+相当于(i+) 若 i=3, 则结果为 3, i增加为4. 3. 良好的程序设计风格提倡:在一行语句中,一个变量只 能出现一次加1或者减1运算; 禁止出现: k=(+i)+(+i)+(+i) 过多的加过多的加1 1和减和减1 1运算混合,运算混合,不仅可读性差不仅可读性差,而且因为编译,而且因为编译 器实现的方法不同,器实现的方法不同,导致不同编译器产生不同的运行结果导致不同编译器产生不同的运行结果 2.6.7 强制类型转换运算符 可以利用强制类类型转换转换 运算符将一个表达式的 值值 转换转换 成所需类类型,但不能转变变转变变 量的类类型。 一般形式: ( (类类类类型名型名)()(表达式表达式) ) 例如: (double) 将表达式的值转换成double型 (int)(x+y) 将表达式x+y的值转换成整型 (float)(5%3) 将5%3的值转换成float型

温馨提示

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

评论

0/150

提交评论