《三章数据类型运算符与表达式三章》由会员分享,可在线阅读,更多相关《三章数据类型运算符与表达式三章(80页珍藏版)》请在金锄头文库上搜索。
1、第三章吩汰肿翼蹋浪登婶拘垫锻这烁涧计蛮荒狐永构移印岔略吐瞪离夸取零轨木三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章l 本章要点本章要点鸯尧谩龚栏黔育屏类穆荣壤镍塌臻隙叭双汐访拣暗主声慈港辱蹈芬谜交盾三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章l 主要内容主要内容3.1 C3.1 C的数据类型的数据类型3.2 3.2 常量与变量常量与变量3.3 3.3 整型数据整型数据3.4 3.4 浮点型数据运行浮点型数据运行3.5 3.5 字符型数据字符型数据 铺惰哆阿后溢区润响晋亥畔仔倔砸抱又邻摄卡粳队攒滇吭陨抡惭蔗污滑存三章数据类型运算符与表达式-三章三章数据类型
2、运算符与表达式-三章l 主要内容主要内容3.3.变量赋初值变量赋初值 3.7 3.7 各类数值型数据间的混合运算各类数值型数据间的混合运算 3.8 3.8 算术运算符和算术表达式算术运算符和算术表达式 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 3.10 3.10 逗号运算符和逗号表达式逗号运算符和逗号表达式 旅邓惶萍铆辫桥举绘研瓢雀皇愿奢保伺唾媳兽吟滴堂薯遏贺凛尘误娥趴曙三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.1 C的数据类型C语言提供了以下一些数据类型。 数据类型数据类型构造类型构造类型指针类型指针类型空类型(空类型(无值类型)无值类型) v
3、oid void枚举类型枚举类型枚举类型枚举类型 enum enum enum enum数组类型数组类型数组类型数组类型结构类型结构类型结构类型结构类型 struct struct struct struct联合类型联合类型联合类型联合类型 union union union union基本类型基本类型整型整型整型整型 int int int int字符型字符型字符型字符型 char char char char实型(浮点型)实型(浮点型)实型(浮点型)实型(浮点型)单精度实型单精度实型单精度实型单精度实型 float float float float双精度实型双精度实型双精度实型双精度实型
4、 double double玉我辰紧巧甩箱革擎他烈谐涧契轮届帖洒屹纲权母挝命删恢翰拿仓发褪溃三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.2 常量与变量3.2.1 常量和符号常量常量和符号常量v在程序运行过程中,其值不能被改变的量称为常量v常量区分为不同的类型:整型 100,125,-100,0实型 3.14 , 0.125,-3.789字符型 a, b,2字符串 “a”, “ab”, “1232”汞逃乐眺跳淆吐司勇定吾澳挽爬弧俞提肘另凑上路描三郸专孟怯道匈蹦摄三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章例3.1 符号常量的使用#define PRI
5、CE 30#define PRICE 30#include #include void main ( )void main ( ) int num, total; int num, total; num=10; num=10; total=num * PRICE; total=num * PRICE; printf(total=%dn,total); printf(total=%dn,total); 说明:说明:说明:说明:程序中用#define命令行定义PRICE代表常量30,此后凡在本文件中出现的PRICE都代表30,可以和常量一样进行运算。说明:说明:说明:说明:用一个标识符代表一个常量
6、的,称为符号常量,即以标识符形式出现的常量。一般情况下,符号常量用大写字母表示。符号常量的值在其作用域(在本例中为主函数)内不能改变,也不能再被赋值。vv说明:说明:说明:说明:如再用赋值语句给PRICE赋值是错误的。vPRICE=40;/* 错误,不能给符号常量赋值. 运行结果:运行结果: total=300total=300场膊砷鞋吵受碍砒为虫舅钎际氧办匆航裤晃赌伯姆兹慧痉彩给螺溃哟睁椿三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.2 常量与变量3.2.2变量变量v变量代表内存中具有特定属性的一个存储单元,它用来存放数据。内存中所存数据就是变量的值,在程序运行期间,
7、这些值是可以改变的。v变量名实际上是一个以一个名字对应一个地址,在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。超句晚苫珍识致柴刀抨袜祭焰换赛怜倍厄沧佑入男悍甩郑测究徘肖誉牧他三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.2 常量与变量 变量命名的规定:语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。 例:例:sum,_total, month, Student_name, lotus_1_2_,BASIC, li_ling M.D.John,
8、¥123,3D64,ab 貉峰凡险舰儿鹅操倍甲早箱随堡腆肮从圭颤谊瓜铰顿耿只旨鲍惨烫彼电彝三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.2 常量与变量注意:注意:注意:注意:v编译系统将大写字母和小写字母认为是两个不同的字符。 v建议变量名的长度最好不要超过8个字符。v在选择变量名和其它标识符时,应注意做到“见名知意”,即选有含意的英文单词 (或其缩写)作标识符。v要求对所有用到的变量作强制定义,也就是“先定义,后使用” 。带醛滇漠偏图粥履蛊烃偿愈卷碌幅枚锌驯闰醇瞳投呼毛拨力二抓边涂辜折三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章vC语言中的关键字及
9、用作特殊用途的标识符不能用作一般标识符的定义。例如: 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培衔邑海黑锣拨虫妇泻虏蜕腐浅命桅拜敲水愚肖饺边磋太走姆搅置汇抓偶三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.3 整型数据3.3
10、.1整型常量的表示方法整型常量的表示方法 整型常量即整常数。在语言中,整常数可用以下三种形式表示:(1)十进制整数。 如:如:123, -456.4。(2)八进制整数。以0头的数是八进制数。 如:如:0123表示八进制数123,等于十进制数83,-011表示八进制数-11,即十进制数-9。遵衍强浓居角朗屁盲踩珍羹勉柏郧晌审靖乌淋万招屋椿喳肢松呕笋厄践尔三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.3 整型数据(3)十六进制整数。以0x开头的数是16进制数。 如:如:0x123,代表16进制数123,等于十进制数 291。 -0x12等于十进制数10。 3.3.2 整型变
11、量整型变量 (1)(1)整型数据在内存中的存放形式整型数据在内存中的存放形式 数据在内存中是以二进制形式存放的。 如如: : int i; /* 定义为整型变量 */ i=10; /* 给i赋以整数10 */ 衅长耀诺撂蹲汕崭媳拆衬戎瘸梳沽镜钟悍蛙鳃畴励炊指锥壕舰肥涎拎买专三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章3.3 整型数据注意:注意:注意:注意:v十进制数10的二进制形式为1010,Turbo C 2.0和Turbo C+ 3.0为一个整型变量在内存中分配2个字节的存储单元(不同的编译系统为整型数据分配的字节数是不相同的,VC+ 6.0则分配4个字节)。v数值是以
12、补码(complement) 表示的。 正数的原码和补码相同。求负数的补码:对原数取绝对值,求其原码,在按位取反,最后在末尾数上加1。 大筋唇筑浓矫霸榴亲寒昏乓路医啦也饰刁颠铱炯北旬拘道涟痘土巾掘吝橇三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章3.3 整型数据(2)(2)整型变量的分类:整型变量的分类:共六种共六种有符号基本整型有符号短整型有符号长整型无符号基本整型无符号短整型无符号长整型(signed)int (signed)short (int )(signed) long (int)unsigned intunsigned short (int)unsigned lo
13、ng (int) 注意:注意:括号表示其中的内容是可写可不写的.豹亥例缨痕鹿归狱氛付膘傅辞譬靶母溢放弥飘孵序本济溜牢肚史鹰政岭茶三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.3 整型数据v整数类型的有关数据: 类型类型 类型说明符类型说明符 长度长度 数的范围数的范围 基本型基本型 int 2 int 2字节字节 -32768 -327683276732767 短整型短整型 short 2 short 2字节字节 -2 -215152 21515-1 -1 长整型长整型 long 4 long 4字节字节 -2 -231312 23131-1-1 无符号整型无符号整型
14、unsigned 2 unsigned 2字节字节 0 06553565535 无符号短整型无符号短整型 unsigned short 2 unsigned short 2字节字节 0 06553565535 无符号长整型无符号长整型 unsigned long 4 unsigned long 4字节字节 0 0(2 23232-1-1)闯牢切蜜爪箔拙逢床杀长程锄盟茸膛学勿灶嚣娟墨居褐野痈刁失殆儡埃捌三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.3 整型数据(3)(3)整型变量的定义整型变量的定义: : 规定在程序中所有用到的变量都必须在程序中定义,即“强制类型定义”。
15、 例如例如: : int a,bint a,b(指定变量、为整型) unsigned short c,d;unsigned short c,d;(指定变量、为无符号短整型) long e,f;long e,f;(指定变量、为长整型)具击评一楞芯劈从索撬怂国棱忘廉湛为吾毫坝毁咽擦女羊诈略条览尿囚夜三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章例3.2 整型变量的定义与使用#include #include void main()()int a,b,c,d; /*指定、为整型变指定、为整型变 量量* unsigned ; *指定为无符号整型变量指定为无符号整型变量*12;-24;
16、10;printf(,);,);说明:说明:说明:说明: 可以看到不同种类的整型数据可以进行算术运算.TC环境下,一般将变量声明语句放在函数的开头的声明部分。 运行结果:运行结果: , 蜗派溉涣预订褥缨敦嫡佛拥狂瑚旬涨妥手溪匀琴度扣慧潦恕渭谗瓤泵睹年三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章例3.3 整型数据的溢出#include #include void main()void main()int a,b; int a,b; a=32767; a=32767; b=a+1; b=a+1; printf( printf(“%d,%dn%d,%dn”,a,b);,a,b);
17、 说明:说明:说明:说明:数值是以补码表示的。一个整型变量只能容纳-3276832767范围内的数,无法表示大于32767或小于-32768的数。遇此情况就发生“溢出”。运行结果:运行结果: 32767,-3276832767,-32768玛沤蛋眉赌胳熔郸年株顽践北破惟堂沙怯争崩涎狙沼潘褪淤训裤仑蝴醛纽三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.3 整型数据3.3.3 整型常量的类型整型常量的类型 (1)一个整数,如果其值在-32768+32767范围内,认为它是int型,它可以赋值给int型和long int型变量。 (2) 一个整数,如果其值超过了上述范围,而在-
18、2147483637+2147483647范围内,则认为它是为长整型。可以将它赋值给一个long int型变量。 虫剑道害虽字颂虚戚门六仕逆仗苍捍衬睫还锚份饯继拱幕醒迎蒋臭呐快碍三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.3 整型数据(3) 如果所用的C版本(如Turbo C)分配给short int与int型数据在内存中占据的长度相同,则它的表数范围与int型相同。因此一个int型的常量同时也是一个short int型常量,可以赋给int型或short int型变量。曙肚糙嫡污状快跋色示斧那向擦帅外谆药凯垃伎讯共嫁氰较炼以肩炔抨俞三章数据类型运算符与表达式-三章三章
19、数据类型运算符与表达式-三章 3.3 整型数据(4) 一个整常量后面加一个字母u或U,认为是unsigned int型,如12345u,在内存中按unsigned int规定的方式存放(存储单元中最高位不作为符号位,而用来存储数据)。如果写成-12345u,则先将-12345转换成其补码53191,然后按无符号数存储。蛹龚征葱桃罪杭汾湃西头虹陆羡牡怯怜靳辗剔深霄果虎啤涩包蛰蔽奢敌姿三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.3 整型数据(5) 在一个整常量后面加一个字母l或L,则认为是long int型常量。例如123l.432L.0L等。这往往用于函数调用中。如果函
20、数的形参为long int型,则要求实参也为long int型。仗莲址式太击铝奈辫毖翘耐糕蕴圈沫丫珠陌部搅丽耍丰织饶挛晕拯院降溯三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.4 浮点型数据3.4.13.4.1浮点型常量的表示方法浮点型常量的表示方法两种表两种表示形式示形式小数小数指数指数0.1230.1233e-33e-3注意注意: :小数形式表示,必须有小数点。字母e(或E)之前必须有数字,且e后面的指数必须为整数。1e31e3、1.8e-31.8e-3、-123e-6-123e-6、-.1e-3-.1e-3e3e3、2.1e3.52.1e3.5、.e3.e3、e e
21、 钱钞跨烛啼贩壁媳玫锰廉寺牢言弘撰书荚咋即风隋贿量峰苇潭匪洛王郧撒三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.4 浮点型数据规范化的指数形式:规范化的指数形式: 在字母e(或E)之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字. 例如例如: : 123.456可以表示为: 123.456e0, 12.3456e1, 1.23456e2, 0.123456e3, 0.0123456e4, 0.00123456e 其中的1.23456e31.23456e3称为“规范化的指数形式”。艇呛级故约衡满叉毙疽榜可岂炒记魂甸椎嘲丙每溉中淄塔胰暴芋石淌担葱三章数据类型运
22、算符与表达式-三章三章数据类型运算符与表达式-三章 3.4 浮点型数据3.4.2 浮点型变量浮点型变量(1)(1)浮点型数据在内存中的存放形式浮点型数据在内存中的存放形式 一个浮点型数据一般在内存中占4个字节(32位)。与整型数据的存储方式不同,浮点型数据是按照指数形式存储的。系统把一个浮点型数据分成小数部分和指数部分,分别存放。指数部分采用规范化的指数形式。拔柒诛鼠门扁牲搂屹趴篷庭荧器伦淹镐劳战硼烬辙渤光塑埔秒之脱叙绘吏三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章类型类型 位数位数 数的范围数的范围 有效数字有效数字float 32 10float 32 10-37 -3
23、7 101038 38 6 6 7 7 位位doubledouble型型 64 10 64 10-307-307 1010308308 15 15 1616位位long double 128 10long double 128 10-4931-4931 10104932 4932 1818 1919位位 3.4 浮点型数据(2) (2) 浮点型变量的分类浮点型变量的分类 浮点型变量分为单精度(float型)、双精度(double型)和长双精度型(long double)三类形式。圃闽掐抵册罢渊邹荫诡熬着魏躺免曝铅囱汤碘摹蚂掀灌努灼淖臃屁痘衡衬三章数据类型运算符与表达式-三章三章数据类型运算符与
24、表达式-三章例3.4 浮点型数据的舍入误差#include #include void main()void main()float a,b;float a,b; a = 123456.789e5; a = 123456.789e5; b = a + 20 ; b = a + 20 ; printf( printf(“%fn%fn”,b);,b); 说明:说明:说明:说明:一个浮点型变量只能保证的有效数字是7位有效数字,后面的数字是无意义的,并不准确地表示该数。应当避免将一个很大的数和一个很小的数直接相加或相减,否则就会“丢失”小的数运行结果:运行结果: 123456.789e5123456.
25、789e5慈嘴滞仔淘肌也嚷饱悦坍楚敷折否理冤四琅甩凳帖后颗码苟香数烬霜穆攫三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.4 浮点型数据3.4.3 浮点型常量的类型浮点型常量的类型 C编译系统将浮点型常量作为双精度来处理。 例如例如:f = 2.45678 * 4523.65 系统先把2.45678和4523.65作为双精度数,然后进行相乘的运算,得到的乘也是一个双精度数。最后取其前7位赋给浮点型变量f。如是在数的后面加字母f或F(如1.65f, 654.87F),这样编译系统就会把它们按单精度(32位)处理。敌抽酶蛰攫够阔徒谜杜瘸暗菱鄙藤砰瞅谚馅拥奄寅履频好塞伏锅抿诫秆
26、甄三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.5字符型数据 3.5.1 字符常量字符常量(1)用单引号包含的一个字符是字符型常量(2)只能包含一个字符a a, ,A A, , 1 1abcabc、“a a”继吩稽捏竖泞姬庭淀防子仟肾圾憨袄尸伞贰蘸义环炼惹醇势劫捂萤阅特茸三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.5字符型数据 有些以有些以“”“”开头的特殊字符称为转义字符开头的特殊字符称为转义字符n 换行t 横向跳格r 回车 反斜杠ddd ddd表示1到3位八进制数字 xhh hh表示1到2位十六进制数字(注意:八进制和十六进制数字的有效数)
27、粘匠伶耶姻煤焕是或旋临唉觉旦持坪淬环仪酌姥湃滴略列筹羡盗芳延汝苯三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章例3.5 转义字符的使用#include #include void void ()()( ab ct ab ct derftgnderftgn); ; printf(htibbj kn); printf(htibbj kn);v打印机上的显示结果:打印机上的显示结果: fab c gde h jikv显示屏上显示屏上的运行结果:的运行结果: f gde j k刷炸报狂伎铃辈肮舅匡感翻桂拨揭翔赵饺傲逢恳连毕社恭糙毙奖许页翱碾三章数据类型运算符与表达式-三章三章数据类型
28、运算符与表达式-三章 3.5字符型数据 3.5.2字符变量字符变量v字符型变量用来存放字符常量,注意只能放一个字符。v字符变量的定义形式如下:char c1,c2;v在本函数中可以用下面语句对c1,c2赋值: c1a;c2 b ;v一个字符变量在内存中占一个字节。 酱抵鄙朋尤器池阵磷首面眯弃沧鞘陷露橱紧摹殖章驳嘿菌常刺胸梯癌菌妓三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.5字符型数据 3.5.3字符数据在内存中的存储形式及其使用方法字符数据在内存中的存储形式及其使用方法v将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的A
29、SCII代码放到存储单元中。存储单元只能存放0-255范围内的整数。这样使字符型数据和整型数据之间可以通用。一个字符数据既可以以字符形式输出,也可以以整数形式输出。慎吗芒旁侈燃檄亮怂管界摹老羔忧散酉汰稳戳涝仗岩献愤厉袜呆克窿旭枢三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章例3.6 向字符变量赋以整数。 #include #include void main()void main()char c1,c2;char c1,c2; c1=97; c1=97; c2=98; c2=98; printf( printf(“%c %cn%c %cn”,c1,c2);,c1,c2); p
30、rintf( printf(“%d %dn%d %dn”,c1,c2);,c1,c2); vv说明:说明:说明:说明:在第和第4行中,将整数和分别赋给c1和c2,它的作用相当于以下两个赋值语句:c1;c2;因为a和b的ASCII码为和v运行结果:运行结果: 97 98 97 98辟考谰枪襟轨笑鄂疼玫走欢款徒转旁雍粮敌遏钞丘两忱家徊臼丝及迂苹悍三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章例3.7 大小写字母的转换 #include #include void main()void main()char c1,c2char c1,c2; c1= c1=a a; ; c2= c2
31、=b b; ; c1=c1-32; c1=c1-32; c2=c2-32; c2=c2-32; printf( printf(“c c cc,c1,c2c1,c2););vv说明:说明:说明:说明:程序的作用是将两个小写字母a和b转换成大写字母A和B。从代码表中可以看到每一个小写字母比它相应的大写字母的码大。语言允许字符数据与整数直接进行算术运算。 v运行结果:运行结果: 洁杂肾纬沦雕凳溪推疤新肥谦拯茸检伊拈空唐为丸碱夫快冶红例梦昭株球三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章3.5字符型数据3.5.4字符串常量字符串常量v字符串常量是一对双撇号括起来的字符序列.v合法的
32、字符串常量:“How do you do.”, “CHINA”, “a” , “$123.45”v可以输出一个字符串,如printf(“How do you do.”);焕祖闸瘫粟虽扇甸鸳庆彤脓匝乎瘸例尿蔓亚月赤眠淬鲸桨酋冯弹婿疑晚葡三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.5字符型数据 是字符常量,”是字符串常量,二者不同。 如:如:假设被指定为字符变量 :char c c=a; ”a”;c”CHINA”; 结论:结论:不能把一个字符串常量赋给一个字符变量。枫歌职招捣苔黍盏冻铺且秀途而葡群待们秘当供矽钵鸣州赫邯赃韵避啊洲三章数据类型运算符与表达式-三章三章数据类型
33、运算符与表达式-三章 3.5字符型数据v规定:在每一个字符串常量的结尾加一个 “字符串结束标志”,以便系统据此判断字符串是否结束。规定以字符作为字符串结束标志。 如:如:如果有一个字符串常量” ,实际上在内存中是:CHINA0 它占内存单元不是个字符,而是个字符,最后一个字符为。但在输出时不输出。伤粥坑讨裁瓜务赊械嘱功啊稠宁葡兜氮价搭粕这敏仪鹰夷须饱林六侵颁爸三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.6变量赋初值 字符串常量(1)语言允许在定义变量的同时使变量初始化如如: : int a=3; / 指定为整型变量,初值为 float f=3.56; / 指定为浮点型
34、变量,初值为.56 char c= a; / 指定为字符变量,初值为a 贰距牛拧室紫偏掂酝当四丢淑侗更来琐蓑钡娘鸯囱蝉拙绪试秋禹迅瓣颐厢三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章3.5字符型数据例:字符串“ta017bc”在内存中所占字节数为6。 字符串“ta018bc”在内存中所占字节数为7。 分析其原因. 哑噬洛抱蜡律呀坑憋媚爪崎几揽也书磨禽班积橱涣硝幂租石飘奸阳创间付三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.6变量赋初值 (2)可以使被定义的变量的一部分赋初值。 如如: : int a,b,c=5; 表示指定、为整型变量,但只对初始化,c
35、的初值为(3)如果对几个变量赋以同一个初值, 应写成:int a=3,b=3,c=3; 表示、的初值都是。 不能写成 int a=b=c=3; 注意:注意:初始化不是在编译阶段完成的而是在程序运行时执行本函数时赋初值的,相当于有一个赋值语句。 撮艳阑茹志襟恨遍物窘今神绑彪镐资笔兰怖砸机呛谩票阜雹姿靖谍稍癸梅三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章3.7各类数值型数据间的混合运算 整型(包括int,short,long)、浮点型(包括float,double)可以混合运算。在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算.例表达式3.14*5的类型为doubl
36、e型。津秧圭倘震澳郝劲拣屈他略朝掸堂煌铝折舵仗炮朝慢祖邵蛊阂琶考酮容陶三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.8算术运算符和算术表达式3.8.1 运算符简介运算符简介 的运算符有以下几类:的运算符有以下几类:(1)算术运算符 (+ - * / %)(2)关系运算符 (!)(3)逻辑运算符 (!|)(4)位运算符 ( |)(5)赋值运算符 (及其扩展赋值运算符)(6)条件运算符 (?:)(7)逗号运算符 (,)朴征厘抑垣哩揖唱堵哩刁各现跪帮音右蛆拨觉芜铆程茅篙愿杠玲肌答宁譬三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.8算术运算符和算术表达式
37、(8)指针运算符 (*和)(9)求字节数运算符()(10)强制类型转换运算符( (类型) )(11)分量运算符(-)(12)下标运算符()(13)其他 (如函数调用运算符()涸妨坍爆仔继卡牙抄陕在烁出去昭块称右函鲸褥亨键环峨蚊降份淫红宁吠三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.8算术运算符和算术表达式3.8.2 算术运算符和算术表达式算术运算符和算术表达式 (1)(1)基本的算术运算符基本的算术运算符: : (加法运算符,或正值运算符。如:、) (减法运算符,或负值运算符。如:、)* * (乘法运算符。如:*) (除法运算符。如:) (模运算符,或称求余运算符,两
38、侧均应为整型数据,如:的值为)。翟尽肪谗沃为劲宅膳赢亭荔阜世又瀑入抨然瘪宛顷篓获碍董触酞次销慑俺三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.8算术运算符和算术表达式(2) (2) 算术表达式和运算符的优先级与结合性基本的算术运算符算术表达式和运算符的优先级与结合性基本的算术运算符: : 用算术运算符和括号将运算对象(也称操作数)连接起来的、符合语法规则的式子,称为算术表达式。运算对象包括常量、变量、函数等。 例如例如: : *.5a 是一个合法的表达式隘谜炉牧剑栗凛喇枕介咳弥彩尸茅浮衅辖清狂阮熄身饰草帮抗凶述盲闷夜三章数据类型运算符与表达式-三章三章数据类型运算符与表
39、达式-三章 3.2 常量与变量v语言规定了运算符的优先级和结合性。 在表达式求值时,先按运算符的优先级别高低次序执行,例如先乘除后加减。 v规定了各种运算符的结合方向(结合性) 算术运算符的结合方向为“自左至右”,即先左后右 。妊幂鸦文既糊驾送嚼懂娜岔疥碟甸采董辱鲤宏沪午廷推赘尊淀创拎姬鹅挂三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.8算术运算符和算术表达式(3)(3)强制类型转换运算符强制类型转换运算符 可以利用强制类型转换运算符将一个表达式转换成所需类型。 一般形式:(类型名)(表达式)例如:例如:v(double) 将转换成double类型v(int)(x+y)
40、 将x+y的值转换成整型v(float)(5%3) 将5%3的值转换成float型绢斜摈蚕材阉士晨卞煮席悸扒煎懦上卸旷分睛沸戌洲努驱比衙未盘盾攘烛三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章例3.8 强制类型转换。 #include #include void void ()() ; ; ; ();(); printf(x=%f printf(x=%f, i=%dn i=%dn,x x,i);i); vv说明:说明:说明:说明:有两种类型转换,一种是在运算时不必用户指定,系统自动进行的类型转换,如3+6.5。第二种是强制类型转换。当自动类型转换不能实现目的时,可以用强制类型
41、转换。v运行结果:运行结果: x3.600000, i=3瘟缮詹低决嘶皆棵也嫡洞适帽惧厘琉批棕蔼非艺谗送狱酬稳钙嗽顺骤衅曹三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.8算术运算符和算术表达式(4)(4) 自增、自减运算符自增、自减运算符 作用是使变量的值增或减如如: v,(在使用之前,先使的值加 (减)v,(在使用之后,使的值加( 减) 吗湍畦捐揍腾垫巍黄绍郑僧菏疹瞪撬纳吗托谰痢廖拴历龙氯稳适缸传岩戎三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.8算术运算符和算术表达式i+i+与与+i+i的区别:的区别: 是先执行后,再使用的值,因此表达式的值
42、为增加后的i值; 是先使用的值后,再执行,因此表达式的值为未增加的i值。例如:例如: ; i的值先变成4, 再赋给,i,j的值均为 ; 先将 i的值3赋给,的值为,然后变为倒淬击宏拙符钳掳饼砍直栓危莎烤悯框绞走恃酸寥搞薛碟仇等鳃疲展华窟三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.8算术运算符和算术表达式注意:注意: (1)自增运算符(),自减运算符(),只能用于变量,而不能用于常量或表达式, (2)和的结合方向是“自右至左”。 鸭奇孝防俭霉秃姚分鄙管吸号欲吻肛婚气氮韩捂鸥粤讣遏插阐链呢萌刀泅三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.8算术运
43、算符和算术表达式(5) (5) 有关表达式使用中的问题说明有关表达式使用中的问题说明 ANSI C并没有具体规定表达式中的子表达式的求值顺序,允许各编译系统自己安排。 例如:对表达式 a = f1( )+f2( ) 并不是所有的编译系统都先调用f1( ), 然后调用f2( )。在有的情况下结果可能不同。有时会出现一些令人容易搞混的问题,因此务必要小心谨慎。 述蛀锁炸荐饰囱馋蹲向较睦铰涝瑞籽钝洽靖嵌筑腊贱础抛拐龄票枯衫拍绿三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.8算术运算符和算术表达式语言中有的运算符为一个字符,有的运算符由两个字符组成 ,为避免误解,最好采取大家都
44、能理解的写法。 例如:不要写成i+j的形式,而应写成 (i+)+j的形式 斋轿榨坯子粤猜芭浩哎侨词踩涉雀套批钩熔澄笨岂卸常确超救已尊裂漓兼三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.8算术运算符和算术表达式在调用函数时,实参数的求值顺序,标准并无统一规定。例如:例如:的初值为,如果有下面的函数调用: printf(,i+) 在有的系统中,从左至右求值,输出“,”。在多数系统中对函数参数的求值顺序是自右而左,函数输出的是“,”。以上这种写法不宜提倡, 最好改写成 j = i+; j = i+; printf(%d printf(%d, %d %d, j j,i)i)不要
45、写出别人看不懂的也不知道系统会怎样执行程序铱鞋碉诬家昂夜深假茨蹲脯炽稿氛卜绊拔傈雨滤叙蕾舒嘿奉锁腔瘁比丧凌三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.9 赋值运算符和赋值表达式 (1)(1)赋值运算符赋值运算符 赋值符号“”就是赋值运算符,它的作用是将一个数据赋给一个变量。如“”的作用是执行一次赋值操作(或称赋值运算)。把常量赋给变量。也可以将一个表达式的值赋给一个变量. 妈亥寒懒汤凿下涛蔡仑靖譬逛炬胀渡挨哭节毛否戳瘪蔫籽景丘看钒杏线慷三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.9 赋值运算符和赋值表达式 (2) (2)类型转换类型转换 如果
46、赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。将浮点型数据(包括单、双精度)赋给整型变量时,舍弃浮点数的小数部分。如如: :为整型变量,执行“i=3.56”的结果是使的值为,以整数形式存储在整型变量中.吠替芝凳桌垦吹才岗纹逮驯什掳轩接迈对堕嚣厉范馏滁慈急浴床捎酬屈丧三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.9 赋值运算符和赋值表达式 将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中 如如: : 将赋给float变量,即执行,先将转换成,再存储在中。 将赋给型变量,即执行,则将补足有效位数字为,然后以双精度浮点数形式存
47、储到变量中。 膀捕残顾许撞雄完聪才劝人宵咱恕救滑缸旭再夫惊镑尽薪拴愿榴冠俩勤雾三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.9 赋值运算符和赋值表达式 将一个double型数据赋给float变量时,截取其前面7位有效数字,存放到float变量的存储单元(4个字节)中。但应注意数值范围不能溢出。 如如: :float f;double d=123.456789e100; f=d; 就出现溢出的错误。 如果将一个float型数据赋给double变量时,数值不变,有效位数扩展到16位,在内存中以8个字节存储轮葬喇址撬哥醒榴洒心胶膜肆匠李白秤缮搬寝绞奶贬卞敦眠吓贸搀专虚谚三章数
48、据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.9 赋值运算符和赋值表达式 字符型数据赋给整型变量时,由于字符只占1个字节,而整型变量为个字节,因此将字符数据(个二进位)放到整型变量存储单元的低位中。第一种情况: 如果所用系统将字符处理为无符号的字符类型,或程序已将字符变量定义为 型,则将字符的位放到整型变量低位,高位补零例如:例如:将字符赋给型变量淋珊印痒桨濒韦注悔表矫香菜井讼阎晴鼻遍寻椭架举沥育洗廷困样干摄桂三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.9 赋值运算符和赋值表达式 第二种情况: 如果所用系统(如Turbo C+)将字符处理为带符号的(
49、即signed char),若字符最高位为,则整型变量高位补;若字符最高位为,则高位全补。这称为“符号扩展”,这样做的目的是使数值保持不变,如变量(字符)以整数形式输出为,的值也是。纪虎柏紫悟查悲舅袄恒誊凶禁譬迫膜酵俭既被赘馏州扁氰谰裂滇抒摔濒掷三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.9 赋值运算符和赋值表达式 将一个int、short、long型数据赋给一个char型变量时,只将其低8位原封不动地送到char型变量(即截断)。例如:例如:int i=289;char c=a;c=i; 赋值情况 :c的值为33, 如果用“%c”输出c,将得到字符“!” (其ASC
50、II码为33)。 荆林淹顿键淌氟舍镇秒按穷杰肛威邯极镊杆耀软疤嗅勉楚嘲堪疆邻钩赫揖三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.9 赋值运算符和赋值表达式 将带符号的整型数据(int型)赋给long型变量时,要进行符号扩展,将整型数的16位送到long型低16位中:v如果int型数据为正值(符号位为),则long型变量的高16位补;v如果int型变量为负值(符号位为),则long型变量的高16位补,以保持数值不改变。 反之,若将一个long型数据赋给一个int型变量,只将long型数据中低16位原封不动地送到整型变量(即截断)。 藤胆零梦酌凡脯稗笛逆萤汰文觅惯谣轴痛湃荒
51、内丁桩站戎叉箔累印讥贵豪三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章3.9 赋值运算符和赋值表达式 将unsigned int型数据赋给long int型变量时,不存在符号扩展问题,只需将高位补即可。将一个unsigned类型数据赋给一个占字节数相同的非unsigned型整型变量(例如:unsigned int -int,unsigned long-long,unsigned short-short),将unsigned型变量的内容原样送到非unsigned型变量中,但如果数据范围超过相应整型的范围,则会出现数据错误。怒寡快翠弓负浙帝帘总谦邦含加炊递撅民陨针铝镊辕滩亦去迂颓
52、登垢米恰三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.9 赋值运算符和赋值表达式 例如:例如:unsigned int 65535; int b;; 将整个送到中,由于是int,第位是符号位,因此b成了负数。根据补码知识可知,的值为-1,可以用printf(%d,);来验证。 将非unsigned型数据赋给长度相同的unsigned型变量,也是原样照赋(连原有的符号位也作为数值一起传送)。 子冤讣獭勾父权垣垃耸泉伍厂托粪惑蜗樟官种众朽肯悉沫衙盈吏协隘瞥颜三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章例3.9 有符号数据传送给无符号变量。 #includ
53、e #include void void ()() ; ; ; (nn,);,);vv说明:说明:说明:说明:“%u”是输出无符号数时所用的格式符。如果为正值,且在32767之间,则赋值后数值不变。赋值情况见图 运行结果:运行结果: 粤矛抵翼东漫哗抠衡哎养字偿弄褥伴细韦搬御骸戈饲蠕颓域逢厅觉豹伴嘎三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.9 赋值运算符和赋值表达式 (3) (3) 复合的赋值运算符复合的赋值运算符 在赋值符“”之前加上其他运算符,可以构成复合的运算符。例如例如:v 等价于 v* 等价于 *()v 等价于 以“”为例来说明,它相当于使进行一次自加()的
54、操作。即先使加,再赋给。斥袱济秦效巷统葬令境辕渠烹湿孰韵橡塔分磕薪铂绑贡卓食溃龙吹靡讼闸三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章3.9 赋值运算符和赋值表达式 注意注意: :如果是包含若干项的表达式,则相当于它有如果是包含若干项的表达式,则相当于它有 括号。括号。如:如: x %= y+3 x %= (y+3) |_ x = x %(y+3)(不要错写成x=x%y+3) 凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符。 语言规定可以使用种复合赋值运算符:语言规定可以使用种复合赋值运算符:,* *,| | 都斌啮皿窿口程综畔淳典抽梨育搀司骏咒衙狮谊吻深肄革殖口
55、邮坊麻毕姓三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.9 赋值运算符和赋值表达式 (4) (4) 赋值表达式赋值表达式 由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。一般形式为一般形式为: 例如例如: “5”是一个赋值表达式 姬工没驯绚侣轴底曳味韵砧兑脑贼裁执粗穷儿半纠兑醚掉与妥薯低饮位葫三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.9 赋值运算符和赋值表达式 对赋值表达式求解的过程是:对赋值表达式求解的过程是: 求赋值运算符右侧的“表达式”的值; 赋给赋值运算符左侧的变量。例如例如: 赋值表达式“=3*5”的值为15,执
56、行表达式后,变量a的值也是15。 注意注意: 一个表达式应该有一个值一个表达式应该有一个值 砖挎钦抓愁躬蒂禽炳愧赘善苹莲殖蜂娜涧电兆羽迢皆搜拥砧庸斟慢芳大臭三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.9 赋值运算符和赋值表达式 左值左值 (lvalue) (lvalue) : 赋值运算符左侧的标识符v变量可以作为左值;v而表达式就不能作为左值(如a+b);v常变量也不能作为左值, 右值右值 (lvalue) (lvalue) :出现在赋值运算符右侧的表达式 左值也可以出现在赋值运算符右侧,因而左值 都可以作为右值。裳卿阂眉差诞佩病趋规喝压纶劝戚垄晤猴贮毫誊苔奠锋詹顺闪
57、榷士馆岳腿三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.9 赋值运算符和赋值表达式 赋值表达式中的“表达式”,又可以是一个赋值表达式.例如例如: : a=(b=5) 分析分析: :括弧内的“b=5”是一个赋值表达式,它的值等于5。执行表达式“a=(b=5)”相当于执行“b=5”和“ab”两个赋值表达式。 赋值运算符按照“自右而左”的结合顺序,因此,“(b5)”外面的括弧可以不要,即“a=(b=5)”和“a=b=5”等价.精夸碌避属败剃颠馏姑趾壳涪遁腾僚踊挞捞恒锭喷烬孽坟弗趁篓忘乃才豫三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.9 赋值运算符和赋
58、值表达式 请分析下面的赋值表达式(a=3*5)=4*3分析分析: :先执行括弧内的运算,将15赋给a,然后执行4*3的运算,得12,再把12赋给a。最后a的值为12,整个表达式的值为12。可以看到(a=3*5)出现在赋值运算符的左侧,因此赋值表达式(a=3*5)是左值 注意注意: :在对赋值表达式(a=3*5)求解后,变量a得到值15执行(a=3*5)=4*3时,实际上是将4*3的积12赋给变量a,而不是赋给3*5。不能写成:a=3*5=4*3萝蜕搏果纫隔蛙车墓颅颗灰熊皇猪设段烩憨效礁琳蹲姜蛹侦臻狮酱仁鸯办三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.9 赋值运算符和赋
59、值表达式 赋值表达式也可以包含复合的赋值运算符。 如:如:a+=a-=a*a分析分析: :此赋值表达式的求解步骤如下 先进行“*”的运算, 它相当于*,a的值为144132。再进行“”的运算,相当于=a+(-132),a的值为132-132-264。邮凸脚智僚袭宙痉徊胚茵雅写茎媚褂管虽咬蜗接驹盅促衙递毫栅壤镰摈咋三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.9 赋值运算符和赋值表达式 将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式形式出现在其他语句(如输出语句、循环语句等)中. 如:如:printf(%d,a=b); 分析分析: :如
60、果b的值为3, 则输出a的值(也是表达式a=b的值)为3。在一个语句中完成了赋值和输出双重功能。蹈泳厕慷昆娇煤澜宠脯官货溯逞绍虑冉冷褥挪左复摆屏原焙添杏筑惹乞请三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.10 逗号运算符和逗号表达式逗号运算符逗号运算符: :将两个表达式连接起来,又称为“顺序求值运算符” 如:如:5, 一般形式一般形式: : 表达式,表达式表达式,表达式求解过程:求解过程: 先求解表达式,再求解表达式。整个逗号表达式的值是表达式的值。 逗号表达式 的值为14趋瘫意嘶涪到卡萤崇认浅天皿蛙翻色缴醛悦玫妈测恃掉从检邯放个她榨敞三章数据类型运算符与表达式-三章
61、三章数据类型运算符与表达式-三章 3.10 逗号运算符和逗号表达式例:例:逗号表达式*5,* 分析分析: :赋值运算符的优先级别高于逗号运算符, 因此应先求解*5.的值为5,然后求解*,得。整个逗号表达式的值为。 一个逗号表达式又可以与另一个表达式组成一一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式个新的逗号表达式 如如: :(*,*),a+5 先计算出的值等于,再进行*的运算得60(但值未变,仍为15),再进行得,即整个表达式的值为。窜侗讼猎链挤箭厄斑国罕业涕玛碌堪喷蜕乏幕烩士耽钩邱父蜘涅矽瞒拜车三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章 3.10 逗号运算符
62、和逗号表达式逗号表达式的一般形式可以扩展为 表达式,表达式,表达式,表达式,表达式,表达式,表达式,表达式 它的值为表达式的值。逗号运算符是所有运算符中级别最低的例例: : (,*) ,*3逗号表达式加括号,优先级别高。先计算其值为18,再赋给,的值等于 赋值运算符的优先级别高于逗号运算符,因此先计算赋值表达式、a的值为,整个逗号表达式的值为18。 浚做码峰慌憋怠迭婉霓扬叶狗誉讼浩庶驾挪辆矩膨裁勾五供攀涸风痰圆标三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章3.10 逗号运算符和逗号表达式注意注意: :并不是任何地方出现的逗号都是作为逗号运算符。例如函数参数也是用逗号来间隔的。 如如: printf(“%d,%d,%d”,a,b,c);“,”并不是一个逗号表达式,它是printf函数的3个参数printf(“%d,%d,%d”,(a,b,c),b,c) “(,)”是一个逗号表达式,它的值等于的值。 挟苏瑰戍爹收脑斥藕汾篆甘轨矢琴狠仁摹监烛泛储聋恋诣跨峦高崭缴踩皆三章数据类型运算符与表达式-三章三章数据类型运算符与表达式-三章