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

下载本文档

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

文档简介

数据类型、运算符与表达式,西南财经大学经济信息工程学院 刘家芬 ,C语言大学实用教程,例2.1 第一个C程序,#include void main( ) printf (“This is a program. n”); ,编译预处理命令 导入stdio.h:标准输入输出头文件,C程序的主函数,每个C程序有且仅有一个主函数,void表示主函数不返回任何值。,是stdio.h中定义的标准输出函数,用于在屏幕上显示。,( )中就是需要输出的内容,将用“ ”引起来的字符串原样显示在屏幕上即可,n是一个特殊的字符,称为转义字符。用于控制光标移动到下一行,例2.2 第二个C程序,#include void main() int a,b,sum; a=123; b=456; sum=a+b; printf(“sum is %dn“,sum); ,编译预处理命令 导入stdio.h:标准输入输出头文件,C程序的主函数,每个C程序有且仅有一个主函数,void表示主函数不返回任何值。,定义了三个变量,名字分别是a,b,sum.这三个变量都是int型。,给变量a赋值123,实际上就是向该内存单元放入值123;给变量b赋值456.,变量sum的值是变量a的值加上变量b的值;,调用stdio.h中的printf函数,在屏幕上显示计算结果。首先原样输出sum is,后面的%d是格式控制符,表示“以十进制整数形式输出”变量sum的值,例2.3 第三个C程序,#include void main() int max (int x,int y); int a,b,c; scanf(“%d,%d“, ,声明后面的语句中将使用一个用户自定义的函数max,该函数使用两个整型参数,并且返回一个整型值,使用stdio.h中定义的标准库函数scanf,从键盘读取两个十进制整数,分别赋值给a和b,以a和b作为参数调用用户自定义函数max,并且将该函数的返回值赋给变量c,使用stdio.h中定义的标准输出库函数pintf,这里是函数max的定义部分,该函数使用两个整型参数x和y,作用是找出x和y中较大的值并返回给主程序,C程序的特点,函数是程序的基本单位 主函数 用户自定义函数 系统提供的库函数 函数由函数头和函数体组成 函数头包括返回值类型、函数名、形式参数列表 函数体 由语句;组成,常量(Constant),程序运行过程中保持固定值的数据,根据类型分为: 整型常量 如5,程序2中的123,456 实型常量 如4.6,-1.23,1e-4 字符常量 如5, c, /n 字符串常量 如“5”和程序1中的“This is a program.” 符号常量(宏常量) #define PI=3.1415926 枚举常量 enum enum responseyes,no; enum response answer; answer=yes;,变量(Variable),在程序执行过程中值会发生改变的量 变量名代表着内存中的一个存储单元,里面存放的就是变量的值。 怎么给变量起名字呢? 标识符的命名规则 由英文字母、数字和下划线组成,只能以字母和下划线开头。不允许使用关键字作为标识符的名字 。 区分大小写 除了变量名外,符号常量、自定义函数、数组等的名字也都是标识符, 简单地说,标识符就是用户在程序中起的一个名字。,123,456,我的名字叫a,我的名字叫b,变量使用的原则,使用变量的基本原则先定义,后使用 编译时确定该变量所占用的内存单元的大小 编译时进行合法性检查 例如%求余运算要求两个操作数均为int型。 一条定义语句可定义若干个同类型的变量,以逗号分隔 定义后没有赋初值的变量,其值为随机数 例2中先定义,然后再赋初值 int a,b,sum; a=123; b=456; 也可以在定义的同时初始化 char esc = a; int i = 1;,数据的类型,数据为什么要区分类型? 不同类型的数据代表不同的 数据表示形式 合法的取值范围 占用内存空间大小 可参与的运算种类 常用数据类型有整型、浮点型、字符型等,整型数据之整型常量,十进制整数 18、-31 八进制整数 以0开头,数取0-7 如022,-037,注意区分022和22的值 十六进制整数 以0x开头,数取0-F或者0-f 0x12, -0x1f 整型常量的后缀 无后缀为基本整型 L或者l,表示long长型,占用比基本整型更长的存储单元,如 123占用两个字节,123l、123L占用4个字节,但数值一样。 U或者u,表示unsigned无符号 ,只能表示正数,涉及最高位的意义。,0XA5Lu,整型数据之整型变量,数据在内存中以二进制的补码形式存放。 正数的补码和原码相同。 负数的补码:将该数绝对值的二进制形式,按位取反再加1。 例:求-10的补码 10的原码 取反 再加1 就得到了-10的补码,-10,整型变量的分类,根据所占内存大小 基本型:类型说明符为int,占2个字节。 短整型:类型说明符为short int或short。完全等同于基本型。 长整型:类型说明符为long int或long,在内存中占4个字节。 根据是否有正负符号 有符号,修饰符signed。默认为signed,可省略不写 无符号,修饰符unsigned 两种分类方法交叉组合成六种整型变量,signed VS unsigned,signed与unsigned型的区别: signed的最高位代表符号,0为正,1为负 unsigned的最高位也代表数值 以基本整型int为例,signed int和unsigned int都是占用两个字节,但表示范围不同。 有符号整型量signed int ,最大表示 =32767 无符号整型量unsigned int =65535,整型变量的取值范围,如果超出了该变量的取值范围,会出现什么情况呢?,溢出!,例2.4 溢出举例,#include void main() int i, j, m, n; i=32767; j=i+1; m=-32768; n=m-1; printf(“i=%d, j=%dn“,i,j); printf(“m=%d, n=%dn“,m,n); ,溢出(Overflow),C语言直接提供的任何类型都有取值范围。当向其赋超过此范围的数值,就会产生数值溢出,得到一个不正确的结果。 int 型数32767在内存中的表示方法: 加1 补码解释为-32768 如何避免类似的错误?,typeoverflow.c,浮点型数据之浮点型常量,浮点数就是实数,有两种表示形式 十进制小数形式 0.0、25.0、5.789、0.13、5.0、300.、-267.8230必须有小数点 指数形式 如2.1e5、- 2.8E-2等。E之前必须有数字,并且指数部分为整数。 例:123.456可以表示为: 123.456e0, 12.3456e1, 1.23456e2, 0.123456e3, 0.0123456e4 后缀为“f”或“F”表示该数为单精度浮点数 365是浮点数吗? 365.是浮点数吗? 365.00是浮点数吗? 365f是浮点数吗?,浮点型数据的存放,浮点型数据在内存中以指数形式存放 N=S2j,所占位数决定 实数的取值范围,所占位数决定 实数的精度,例2.5关于实数的输出,#include main() float f=123.456; printf(“f in decimal: %fn“,f); printf(“f in exponent: %en“,f); ,浮点型变量的分类,单精度(float型) 占用4个字节,有效数字7位 双精度(double型) 占用8个字节,有效数字16位 长双精度(long double型) 占用16个字节,较少使用 什么是有效数字? 回顾例2.5的执行结果 注意:浮点型常量都作为双精度来处理,例 2.6 float型的有效位数,#include “stdio.h“ main() float a; double b; a = 123456.789e4; b = 123456.789e4; printf(“%fn%fn“, a, b); ,float型中通常用位来存放以二进制表示的尾数部分。将一个较大的十进制小数转化成二进制,通常都会超出位的长度,所以在内存中存放时会舍去后面的小数。之后读取时,按照二进制到十进制的转换规则,输出的就不再是之前赋予的值了。,字符型数据之字符常量,字符常量是用单引号括起来的一个字符。 如a,A,5,%,$等 转义字符是一种特殊的字符常量。 转义字符以反斜线开头,后跟一个或几个字符。 转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。,常见转义字符,101表示?,字符型数据之字符变量,字符变量 代表内存中的一个存储单元,长度为一个字节,用来存放一个字符 char c1,c2; c1=A; c2=a;,字符型数据在内存中的形式,字符型数据是以其ASCII码值的形式存放在内存单元之中的。 char c1,c2; c1=A; c2=a; 字符型数据可以作为取值范围0-255间的整型数据处理。,0100 0001,C1,0110 0001,C2,%c,%d,A,65,%c,%d,a,97,例2.7 字符型数据的处理,#include void main() char c1,c2; c1=97; c2=98; printf(“%c,%cn“,c1,c2); printf(“%d,%dn“,c1,c2); 字符型数据可以以其ASCII码值参与算术运算; 字符型数据可以与整型数据互相赋值; 例如int i=a; char c=97;,字符串(String)常量,字符串常量是由一对双引号括起的字符序列。 例如: “CHINA“ , “ C program “ , “$12.5“ 等都是合法的字符串常量。 字符常量和字符串常量的区别: 字符常量由单引号括起来,字符串常量由双引号括起来。 字符常量只能是单个字符,字符串常量则可以包含一个或多个字符。 字符常量只占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字符数加1,增加的一个字节用于存放字符“0” (ASCII码为0),也就是字符串结束标志。 区别5,5, “5“ 注意:字符串结束标志是由系统自动添加的。,不同类型间的转换,自动转换 不同类型的数据混合运算时,编译系统自动完成类型转换。若参与运算量的类型不同,则先转换成同一类型,然后进行运算。如10+a+1.5 转换按数据长度增加的方向进行,以保证精度不降低。 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型再运算。 char型和short型参与运算时,必须先转换成int型 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。,转换规则,1. 横向的箭头表示必定的转换,例如float型数据在进行计算时,即使两个数都是float型,也要先转换成double型才行。这样做是为了提高精度。 2. 纵向箭头标明了数据类型级别的高低,由低向高进行转换。例如int型和double型运算,首先int型数据要转换成double型,然后再运算。,强制转换,通过类型转换运算来实现,其一般形式为: (类型说明符) (表达式) 其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。 例如: (float) a 把a转换为实型 (int)(x+y) 把x+y的结果转换为整型 注意:无论是强制转换或是自动转换,都只是运算的需要而对变量的数据长度进行的临时性转换,而不改变该变量的类型,例2.8 强制类型转换,#include main() int m = 5; printf(“m/2=%dn“, m/2); printf(“(float)(m/2)=%fn“,(float)(m/2); printf(“(float)m/2 = %fn“, (float)m/2); printf(“m = %dn“, m); ,m/2 = 2 (float)(m/2) = 2.000000 (float)m/2 = 2.500000 m = 5,运算符,算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(+)、自减(-)共七种。 关系运算符:用于比较运算。包括大于()、小于(=)、小于等于()六种。 赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,=,=,=)三类共十一种。 条件运算符:这是一个三目运算符,用于条件求值(?:)。 逗号运算符:用于把若干表达式组合成一个表达式(,)。 指针运算符:用于取内容(*)和取地址(&)二种运算。 求字节数运算符:用于计算数据类型所占的字节数(sizeof)。 特殊运算符:有括号(),下标等几种。,运算符的优先级与结合性,运算符的优先级:在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。 运算符的结合性:语言中各运算符的结合性分为两种 左结合性(自左至右)和 右结合性(自右至左)。 C语言中多数运算符为左结合,例如表达式x-y+z。 C中满足右结合的运算符 单目运算符 赋值运算符 条件运算符,运算符的优先级,1. ( ) - . 2. ! + - + - * & (类型) sizeof 3. * / % 4. + - 5. 6. = 7. = != 8. & 9. 10. | 11. & 12. | 13. ? : 14. = += -= *= /= %= &= = |= = 15. , 用括号来控制运算顺序更直观、方便,并减少出错的概率,算术运算符,+,-,*,/,%,-(取反) 两整数相除结果仍为整数 求余运算的操作数必须为整数,余数符号与被除数相同 算术表达式 用算术运算符将运算对象连接起来的式子 复杂的算术表达式经常需要用到math.h中提供的标准数学函数 P34注意事项,常用的标准数学函数,自增和自减运算符,n+,n-,+n,-n +让参与运算的变量加1,-让参与运算的变量减1 作为后缀运算符时,先用n的原值参与运算,然后n的值加/减1 作为前缀运算符时,先对n的值进行加/减,然后用n的现值参与运算 int i=8; printf(“%dn“,+i); 9 printf(“%dn“,-i); 8 printf(“%dn“,i+); 8 printf(“%dn“,i-); 9 printf(“%dn“,-i+); -8 printf(“%dn”,-i-); -9 自增自减运算符的运算对象只能是变量,不能是表达式例如(a+b)+ 、 (-i)+都是错误的,关系运算符,,=,b且bc? 关系表达式abc的值为真吗?,逻辑运算符,逻辑运算也被称为布尔(Boolean)运算 与运算& a & b当且仅当两者都为真,则结果为真 ( a b & b c) a大于b,并且b大于c 或运算| a | b只要两者中有一个为真,结果就为真 ( a b | b c) a大于b,或者b大于c 求反! ( !a ) 如果a是0,结果非0;如果a是非0,结果是0 并不改变a的值,实例,ch是英文大写字母 (ch = A) & (ch = Z) 判断某一年year是否是闰年的条件是满足下列两个条件之一: 能被4整除,但不能被100整除; 能被400整除; (year % 4 = 0) & (year % 100 != 0) | (year % 400 = 0),赋值运算符,赋值表达式 变量名=表达式,计算右边表达式的值并将其赋给左边的变量。 左侧不允许表达式,只能是标识一个存储单元的变量. 判断a+b=c,x=x+1是否为合法的赋值表达式? 赋值运算符优先级低于算术运算符、关系运算符和逻辑运算符。 满足右结合性。赋值表达式的值等于运算完成后左操作数的值 a=b=c=5 等价于a=(b=(c=5) 赋值表达式将自动进行类型转换,复合赋值运算符,复合赋值表达式 变量 二元运算符 = 表达式 等价于 变量 = 变量 二元运算符 表达式 a += 5 等价于a=a+5 x *= y+7 等价于x=x*(y+7) r %= p 等价于r=r%p 算术运算符+、-、*、/、%和位运算符、&、|运算符都可进行复合赋值运算。,位操作运算符,&按位与运算 |按位或运算 按位异或运算,按位右移运算 按位求反,见书本P41页,例2.9 逻辑运算与位运算,#include void mai

温馨提示

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

评论

0/150

提交评论