C语言程序设计讲解2010-3运算符与表达式.ppt_第1页
C语言程序设计讲解2010-3运算符与表达式.ppt_第2页
C语言程序设计讲解2010-3运算符与表达式.ppt_第3页
C语言程序设计讲解2010-3运算符与表达式.ppt_第4页
C语言程序设计讲解2010-3运算符与表达式.ppt_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

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

文档简介

第3章 基本数据类型、 运算符和表达式 我们在这一章中将要我们在这一章中将要 给大家介绍有关给大家介绍有关C C 基本基本数据类型、数据类型、 运算符以及表达式运算符以及表达式、常量、常量、 变量变量等项内容为后期的等项内容为后期的 程序设计打好基础程序设计打好基础 l 主要内容 1 C的基本数据类型(整型、浮点型、字符型) 2 常量 3 变量、变量赋初值 4 各类数值型数据间的混合运算 5 算术运算符和算术表达式 6 赋值运算符和赋值表达式 7逗号运算符和逗号表达式 8条件表达式、关系表达式与逻辑表达式 /*/*计算两数之和计算两数之和 * */ / main() main() intint a, b, sum; a, b, sum; a=100; a=100; b=200; b=200; sum=a+b; sum=a+b; printf(“sum=%dn”, sum); printf(“sum=%dn”, sum); C C语言程序结构语言程序结构 voidvoid #include /*数据描述部分*/ /*操作部分*/ /*两数之和*/ 对数据对数据 的描述的描述 数据类型数据类型(Data types)(Data types) 数据结构数据结构(Data structure)(Data structure) 数据类型 基本类型 构造类型 指针类型 空类型 整型 实型(浮点型) 字符型 枚举类型 数组类型 结构体类型 共用体类型 单精度实型 双精度实型 基本整型 长整型 短整型 无符号整型 数据类型 基本类型 构造类型 指针类型 空类型 void 整型 int 实型(浮点型) 字符型 char 枚举类型 数组类型 结构体类型 共用体类型 单精度实型 float 双精度实型 double float 基本整型 int 长整型 long int 短整型 short int 无符号整型 unsigned int signed(有符号) unsigned(无符号) long(长型) short(短型) 表3-1 ANSI C标准中的基本数据类型 类类型标识标识 符名字字节节 大小 典型的取值值范围围 void空值型0无值 char字符型1-128127 unsigned char无符号字符型10 255 Int/short int整型/短整型2或4-3276832767 unsigned int /unsigned short int 无符号整型 /无符号短整型 2或4065535 signed short int 有符号短整型2-3276832767 long int长整型4-2 147 483 648 2 147 483 647 unsigned long int 无符号长整型404294967295 表3-1 ANSI C标准中的基本数据类型 (续) 类类型标识标识 符名字字节节 大小 典型的取值值范围围 float单精度型(浮 点型 ) 4-3.4E-38+3.4E+38,7位 精度 double双精度型8-1.7E-308+1.7E308,16 位精度 long double长双精度型10-1.2E-4932+1.2E+4932, 19位精度 o变量是内存中已命名的位置,代表一个内存单元的地址,其 中放置程序可修改的值。 o注意区分变量名和变量值: 在对程序编译连接时由编译系统给每一个变量名分配对应 的内存地址。 o从变量中取值,实际上是通过变量名找到相应的内存地址 ,从该存储单元中读取数据。 7变量值 变量名 a 存储单元 3.2变量 变量是具有类型的内存单 元,类型可以是整型、字 符型及由它们派生出来的 类型。类型决定了变量可 以进行的操作。 3.2.1变量声明与定义 所有C变量都必须在使用前声明和定义。 当创建变量的时候,声明赋予它一个符号名字,定 义给它一个存储空间。 变量一旦被定义,它就可存储数据并接受程序对它的 操作。一般来说,程序员并不关心变量在内存中的具 体位置,仅仅只需要知道可通过它的符号名称对其进 行访问即可。 3.2.1变量声明与定义 当创建变量的时候,声明赋予它一个符号名字,定 义给它一个存储空间。 变量的起名规则(相关知识在2.2.2 -3-(1)) 1第一个字符必须以字母和下划线开始 2. 只能由字符、数字及下划线构成 3. 只有前31个字符有效 4. 不能与关键字相同,也不应该和库函数及用 户自定义的函数重名 例:判断下列字符名是否可以作变量名 sum,_total,month, Student_name, lotus_1_2_,BASIC,li_ling M.D.John,¥123,3D64,ab 3.2.1变量声明 变量定义的一般形式: 类型名 变量列表; 3.2.1变量定义 char code; /*定义了code为字符型变量*/ int i,j,l; /*定义了i, j和l为整型变量*/ unsigned long debt; /*定义了debt为无符号长整型变量*/ float profit,payrate;/*定义了profit, payrate为单精度型变量*/ double pi; /*定义了pi为双精度型变量*/ 类型决定了变量在存储单元中的大小 ,决定了其变量值的取 值范围和可以进行的操作。 3.2.2变量赋初始化 当变量定义以后,其相应的存储空间往往包含着垃圾值 (前期使用所遗留下来的没有意义的值),在这种情况 下,程序员需要在使用它们之前对其进行初始化并把初 始化的数据存放其中。 变量初始化一般形式如下: 类型名 变量名=常值; 如: int a=3; /*指定为整型变量,初值为*/ float f=3.56; /*指定为浮点型变量,初值为.56*/ char c=a; /*指定为字符变量,初值为a*/ 3.2.2变量赋初始化 如: int a,b,c=5; 可以使被定义的变量的一部分赋初值。仅变量c初始值为5 如果需要变量a、b、c的初始值都为5,则应写成: int a=5,b=5,c=5; 也可以写成 int a=b=c=5; 是多重赋值 3.2.2变量赋初始化 注意:初始化不是在编译阶段完成的而是在程序运行时执行 本函数时赋初值的,相当于有一个赋值语句。 例如:int a=3; 相当于: int a; a=3; int count; count变量的值 未知 (不确定) count变量二字节存 储了整型值0 ?0 int count=0; 3.3 常量 常量指在程序的执行过程中不能改变的固定值,可以是 任何基本数据类型的值。和变量一样,常量也有类型。 常量的表示方法依其基本类型而定。 3.3.1常量的表示 整型 100,125L,-100,0 实型 3.14,0.125,-3.789 字符型 a, b,2 字符串 “a”, “ab”,“1232” 3.3.1常量的表示 1.字符常量 (1)字符型常量是用单引号括起来的一个字符。 a、A、 1、?、$ abc、“a” 注意:只能包含一个字符,且使用单引号括起来。 1.字符常量 但是有些字符是没有形状的(如回车符)不能通过键 盘放到字符串里或不能通过输出显示(如响铃)。 为此C语言采用了特殊的反斜线字符常量。这种反斜 杠称为转义字符, 例如,回车符 :r 或 15 (ASCII值是13) 响铃: a 或 7 (ASCII值是13) 表3-2 转义字符表 反斜线码线码意义义反斜线码线码意义义 0空字符b退格 a报警(响铃)反斜扛字符 n换行t横向跳格 r回车“双引号字符 “ 单引号字符 单引号字符 ?问号字符 v垂直制表f换页 N8进制常量(N是 8进制常数)对 应ASCII码字符 xN16进制常量(N 是16进制常数) 对应 ASCII码字 符 1.字符常量 例如, 语句 printf(“ntHello C !an” ); 输出一个新行和一个制表符,然后输出串Hello C! 然后响铃,换到下一行。 1.字符常量 2.整型常量 3.3.1常量的表示 整型常量即整常数。在语言中,可用以下三种形式表示: (1)十进制整数 如:123、-456、4。 (2)八进制整数:以0开头的数。 如:0123表示八进制数123,等于十进制数83, -011表示八进制数-11,即十进制数-9。 (3)十六进制整数:以0x开头的数。 如:0x123,代表16进制数123,等于十进制数291。 -0x12等于十进制数18。 2.整型常量 如果在程序中仅仅使用一串数字,则它的类型是有符 号整数,如果这个数字太大的话,则是有符号长整数 。 可以通过在数字后面增加u或U,l或L来显式表示给定 数字的类型,而避免计算机采用默认的数据类型。 表示形式值值类类型 +123123int -323-323int -32000L -32000 long int 76 5432LU 765432 unsigned long int 建议用大写L 3.实型常量 十进制小数 指数 由数字和小数点组成。例如:0.123、0.0 例如:123e3或123E3,都代表123103 注意: 指数表示中字母e(或E)之前必须有数字,且e后面的指 数必须为整数。 1e31e3、1.8e-31.8e-3、-123e-6-123e-6、-.1e-3-.1e-3 e3e3、 2.1e3.52.1e3.5、 .e3.e3、 e e C语言中的浮点数指平常所说的实数。有两种表示形式: 实型不能用8进制和16进制形式表示。 p一个浮点数可以有多种指数表示形式。 例如: 123.456可以表示为: 123.456e0, 12.3456e1, 1.23456e2, 0.123456e3, 0.0123456e4, 0.00123456e p规范化的指数形式:在字母e(或E)之前的小数部分 中,小数点左边应有一位(且只能有一位)非零的数字。 其中的1.23456e3称为“规范化的指数形式”。 3.实型常量 3.实型常量 缺省的实型常量是double型的。如果期望的类型是float或 long double,则需要用字母进行特定标注。F或f表示float类 型,l或L表示long double类型。 表示形式值值类类型 0.0.0double .00.0double 2.02.0double 3.14163.1416double -2.0f-2.0float 13.4E-2F0.134float 3.141 592 653 6L3.141 592 653 6long double 4.字符串常量 o字符串常量是一对双撇号括起来的字符序列。 o合法的字符串常量: “How do you do.”, “CHINA”,“a”, “$123.45” o注意: 和“”两者不同。 字符常量 字符串常量 假设被指定为字符变量 : char c; c=a; =“a”;c“CHINA”; 结论:不能把一个字符串常量赋给一个字符变量。 o规定:在每一个字符串常量的结尾加一个“字符串结束 标志”,以便系统据此判断字符串是否结束。 o规定以字符作为字符串结束标志。 是一 个ASCII码为0的字符,称为“空操作字符”,即它不引起 任何控制动作,也不是一个可显示的字符。 例如:有一个字符串常量”,它在内存中实际为 CHINA0 它占内存单元不是个字符,而是个字符,最后一个 字符为。但在输出时不输出。 3.3.2代码常量 在编写程序时如何使用常量呢?在编程中经常采用的代 码常量是字面常量、预定义常量和存储常量。 例如,a=b+5; 中的 5 。 #define RATE 0.015 采用预定义命令 ,编译前RATE会被替换为0.015 const 类型标识符 常量名= 数据; const float Cpi=3.14159; 3.3.2代码常量 #include #define PI 3.1415926536 void main() const double Cpi=PI; printf(“Defined constant PI:%fn”,PI); printf(“Memory constant Cpi: %fn”,Cpi); printf(“Literal constant: %fn”, 3.1415926536); 输出结果: Defined constant PI: 3.141593 Memory constant Cpi: 3.141593 Literal constant: 3.141593 说明:预定义常量 习惯上,符号常量名用大写,变量名用小写,以示区别。 #define PRICE 30 #include void main ( ) int num, total; num=10; total=num * PRICE; printf(total=%dn,total); 运行结果: total=300 说明:说明:如再用赋值语句给PRICE赋值是错误的。 PRICE=40; /* 错误,不能给符号常量赋值*/ 3.4 运算符和表达式 的运算符有以下几类: (1)赋值运算符 (及其扩展赋值运算符) (2)算术运算符 (+ - * / %) (3)关系运算符 ( = = | ) (7)逗号运算符 (,) (8)指针运算符 (*和) (9)求字节数运算符( sizeof ) (10)强制类型转换运算符( (类型) ) (11)分量运算符(-) (12)下标运算符( ) (13)其他 (如函数调用运算符() 1 赋值运算符 = : 双目运算符,其表达式的一般形式如下: 变量名= 表达式 例如: a=3 i=d+3 o(=)将右边的操作数3保存在左边的变量a里。赋值号 左边的操作数必须是个变量。 o赋值表达式有一个值和一个副作用:整个表达式的值是 右边的表达式的值;副作用把表达式的值保存在赋值号 左边的变量中。 3.4.1 赋值运算符和赋值表达式 2赋值中的类型转换 : 先看一些简单的升级例子。 char c=A; int i=1234; long double d=3458.0004; i=c; /*65 */ d=c; /*65.0 */ d=i; /*1234.0 */ 3.4.1 赋值运算符和赋值表达式 右边表达式的类型与左 边的变量类型不一致时 ,其副作用是先将右边 表达式的值转换为左边 变量相同的类型,然后 进行赋值。 升级: 一般没问题; 精度并不增加 2赋值中的类型转换 : 再看一些简单的降级例子。 int i=299; char c=a; float f; double d=23.3522e120; c=i; /* c值为43,对应+字符*/ f=d; /*出现溢出错误*/ 3.4.1 赋值运算符和赋值表达式 降级:“放得下没 问题,放不下出问 题”; 通常出问题 左部(目标侧标侧 )右部(表达式类类型)可能丢丢失的信息 signed charchar如果值大于127,目标为负 值 charshort int高8位 charint(16位)高8位 char int(32位)高24位 charlong int高24位 short intint(16位)无 short intint(32位)高16位 int(16位)long int高16位 int(32位)long int无 intfloat小数部分,可能更多 floatdouble精度,结果舍入 doublelong double精度,结果舍入 2赋值中的类型转换 :出问题的降级。 3 多重赋值 例如, 把0同时赋给a、b和c: a=b=c=0 赋值号右边的表达式还可以是赋值表达式: x=10*(y=3) 整个赋值表达式的值是30 , 两个副作用:y变量存储3,x变量存储30。 例:(a=3*5)=4*3 分析: 先将15赋给a,然后执行4*3的运算,再把12赋给a。最 后a的值为12,整个表达式的值为12。 注意:在对赋值表达式(a=3*5)求解后,变量a得到值15,然后再 做别的; 执行a=3*5=4*3时,实际上是将4*3的积12赋给 变量a,而不是赋给3*5。 不能写成: a=3*5=4*3 3 多重赋值 4 复合赋值 例如, x=x+3 写成 x+=3。 在赋值符“=”之前加上其他运算符,可以构成复合的运 算符。语言规定可以使用10种复合赋值运算符有+=,-= ,*=,/=,%=,=, j=+i; i的值增1为11,并j置成11。 i=10; j=i+; j先置成10,i的值增1为11。 所以,其本质 是赋值符号! ! 3.4.2 算术运算符和算术表达式 2. 自增(+)自减(-)运算符 使用自增自减运算,注意 ! 本质上是赋值符号,所以只能用于变量,而不能用 于常量或表达式,如5+或(a+b)+都是不合法的 +和-的结合方向是“自右至左”。 -i+ 相当于 -(i+) 例:i=3; printf(“%d”,-i+); 应输出-3。 (先取出i的值3,输出-i的值-3,然后i增值为4) i=3; printf(“%d”,-+i); 逗号运算符:又称为“顺序求值运算符, 逗号表达式:用逗号把几个运算表达式连接起来所构成 一般形式: 表达式,表达式,表达式表达式 求解过程:自左向右逐个运算,最后一个表达式的结果就 是逗号表达式的运算结果。 如: 3+5,6+8 结果14 3.4.3 逗号,运算符和逗号表达式 pa=15, b=a-8, a+b * 赋值号优先级高于逗号,运算结果表达式值为22* pz=(x=2, y=x+3,y*x+6) *逗号表达式给变量赋值,z值为 16 * p(a=3*5,a*6), a+5 *的值为15,第一个逗号表达式值 90,整个表达式的值 为20。 px=(a=5,2*3) *的值为6, 整个赋值表达式的值为6* px=a=5,2*3 *的值为5, 整个逗号表达式的值为6* 3.4.3 逗号,运算符和逗号表达式 注意: 并不是任何地方出现的逗号都是作为逗号运算符。 例如函数参数也是用逗号来间隔的。 如: printf(“%d,%d,%d”,a,b,c); “a,b,c”并不是一 个逗号表达式,它是 printf函数的3个参 数 printf(“%d,%d,%d”,(a,b,c),b,c) “(a,b,c)”是一个 逗号表达式,它的值 等于的值。 3.4.3 逗号,运算符和逗号表达式 3.4.4关系运算符和逻辑运算符及其表达式 关系运算是比较简单的一种逻辑运算,用关系关系运算是比较简单的一种逻辑运算,用关系 运算符将两个表达式连接起来,就是关系表达式。运算符将两个表达式连接起来,就是关系表达式。 关系表达式是由关系表达式是由真真( (即即 非非0 0值值) ) 或或假假 ( (即即 0 0值值) ) 来表示其关系的;来表示其关系的; 关系表达式的运算结果是:关系表达式的运算结果是: 由由整数值整数值1 1 或或整数值整数值0 0 1 1 truetrue 0 0 falsefalse 运算符运算符名称名称示例示例 大于大于ab ab = = 大于或等于大于或等于a=b a=b b c=ab ? 2、c=10!=9c=10!=9 c c 0 0 1 1 1 关系运算符 2 逻辑运算符 逻辑运算是对两个关系式或逻辑式进行 逻辑运算的,其运算结果: 逻辑真,用整数 “1” 来表示; 逻辑假,用整数 “0” 来表示。 运算符运算符名称名称示例示例 ! 逻辑非逻辑非真真的逻辑非是的逻辑非是假假,反之如此,反之如此 k=(+a=A b=a8 ? 10 : 20; *b的值为20 * 表示:如果a大于8,则b被赋值10;如果ab ? a : cd ? c: d; * 表达式的值为4* 表示:为条件表达式的嵌套,要注意其求值顺序是 自右向左的。先求cd ? c: d的值; 例: a=2,c=a, f=3.0 ; p=f=3.0 ? a=c *表达式p的值为1 * 表示:p的值是2=0 ? x : -x; ch=(ch=a ba; ab; () (ab的结果,a已变成) () (ba的结果,b已变成) () (ab的结果,a已变成) 例如:, 4. “按位非”运算符() 是一个单目(元)运算符,用来对一个二进制 数按位取反,即将变,将变。 0000000000010101 () 1111111111101010 (八进制数177752) 例如,是对八进制数(即二进制数 )按位求反。 5. “按位左移”运算符() a2表示将a的各二进制位右移2位,移到右端的 低位被舍弃,对无符号数高位补0。 例如: a=017时, a的值用二进制形式表示为00001111 a2=00000011 右移一位相当于除以2 右移n位相当于除以2n 在右移时,需要注意符号位问题: 对无符号数: 右移时左边高位补0; 对有符号数: 如果原来符号位为0(该数为正),则左 边补0; 如果符号位原来为1(即负数), 则补0称为“ 逻辑右移”;补1称为“算术右移”。 6. “按位右移”运算符() 例: int a=0113755; a: 1001011111101101 (用二进制形式表示) a1: 0100101111110110 (逻辑右移时) a1: 1100101111110110 (算术右移时) Turbo C采用的是算术右移,即对有符号数右移时 , 空出来的位补符号位。 6. “按位右移”运算符() 3.5表达式求值 表达式是由运算符、常量、变量构成的,它是C语言 最基本的元素 注意:优先级、结合性和数据类型的变换。 在确定表达式求值顺序时,优先级先于结合性使用 ,结合性才在需要时应用。 3.5.1优先级 优先级用于确定复杂表达式求值时不同运算符的计算顺序 C语言把这个概念拓展到15级,见附录C。在表达式求 值时,先按运算符的优先级别高低次序执行,例如先乘 除后加减。同优先级的按规定的“结合方向”处理。 3.5.2 结合性 结合性用来决定复杂表达式求值时含有同优先级运算符 的计算顺序。结合可分从左向右结合和从右向左结合。 例如,算术运算符的结合方向为“从左向右”, 3*8/4%4*5 等价(3*8)/4)%4)*5), 表达式的值为10。 又如,赋值运算符的结合方向为“从右向左” a+=b*=c-=5 等价 (a+=(b*=(c-=5)。 表达式展开后就是(a=a+(b=(b*(c=c-5), 如果a的初值是3,b的初值是5,c的初值是8,表

温馨提示

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

评论

0/150

提交评论