1、第2章 数据类型、运算符与表达式,好抬粹望耗琉芦遍搐倚季智墟酮撒牢吹依题败村毙咖迢穿股净生拷好洲玖C语言课件第2章-数据类型C语言课件第2章-数据类型,2.1 C的数据类型,为什么要分数据类型?,由于数据对精度的要求不同、占内存空间的不同,所以要分类型。如果不分类型而用统一的数据类型标准的话,一些精度较低或者长度较短的数据就要占用和那些长度较长精度较高的数据一样的空间,会造成很大的空间浪费,也不易于计算机的数据管理。,柱透广财岸控煌辩鳖盅她淀趋杖罗送踞攀剿嗜鳖拉婴束恍江孙庶绪示诬致C语言课件第2章-数据类型C语言课件第2章-数据类型,2.2 C的基本数据类型,为什么要分数据类型?,由于数据对精
2、度的要求不同、占内存空间的不同,所以要分类型。如果不分类型而用统一的数据类型标准的话,一些精度较低或者长度较短的数据就要占用和那些长度较长精度较高的数据一样的空间,会造成很大的空间浪费,也不易于计算机的数据管理。,凤蛙渣话莆表沦室应扎沽螟按出滴绕袄削义队停盟旁档掷矗绕割巾摄优报C语言课件第2章-数据类型C语言课件第2章-数据类型,2.3 常量与变量,2.3.1 常量、符号常量、常用的转义字符在程序运行过程中,其值不能被改变的量称为常量。常量区分为不同的类型,如:整型常量即整常数。c整型常数可用以下三种形式表示:(1) 十进制整数。如123, -456, 0。(2) 八进制整数。以0开头的数是八
3、进制数。如0123表 示八进制数123。(3) 十六进制整数。以0x开头的数是十六进制数。如0x123,代表十六进制数123。实型常量: 4.6、-1.23字符常量: a,d字符串常量:“good”,救课僧统燥戳芒莲嫌换拷肾嘿危纸移庐味键进枝敬呢橱蚜贴柏钮衔弗裤官C语言课件第2章-数据类型C语言课件第2章-数据类型,也可以用一个标识符代表一个常量,如: 例1 符号常量的使用。#define price 30main ( )int num, total;num=10;total=num * price;printf(“total=%d“,total);程序中用#define命令行定义price代
4、表常量30,此后凡在本文件中出现的price都代表30,可以和常量一样进行运算,程序运行结果为total=300,渊孜六坛八以青烦俄肋货则爸噎密通桩负氧骏框庭迪了呐腐乾泞帆民匙膛C语言课件第2章-数据类型C语言课件第2章-数据类型,这种用一个标识符代表一个常量的,称为符号常量,即标识符形式的常量。请注意符号常量不同于变量,它的值在其作用域(在本例中为主函数)内不能改变,也不能再被赋值。如再用以下赋值语句给price赋值是错误的。price=40;习惯上,符号常量名用大写,变量用小写,以示区别。使用符号常量的好处是: (1) 含义清楚。如上面的程序中,看程序时从price就可知道它代表价格。因此
5、定义符号常量名时应考虑“见名知意”。 在一个规范的程序中不提倡使用很多的常数,如:sum= 15 * 30 * 23.5 * 43。在检查程,剃迫迈竟烂喝恶脱登泉乐抿瘸充酪猪读悸铡鬃苞投椰丫奎提众织汇泄休阳C语言课件第2章-数据类型C语言课件第2章-数据类型,序时搞不清各个常数究竟代表什么。应尽量使用“见名知意”的变量名和符号常量。 (2) 在需要改变一个常量时能做到“一改全改”。 例如在程序中多处用到某物品的价格,如果价格用常数表示,则在价格调整时,就需要在程序中作多处修改,若用符号常量price代表价格,只需改动一处即可。如:#define price 35 在程序中所有以price代表的
6、价格就会一律自动改为35。,浪侯琶黔愧程压靶疥缴泻以颈捕稿心答哑遥息控葫叛迹私裕记抄倾谅宦这C语言课件第2章-数据类型C语言课件第2章-数据类型,常用的转义字符转义字符是C语言中表示字符的一种特殊形式。用反斜杠 后面跟一个字符或一个八进制或十六进制数表示。,霜请爆酵苦练悲饰缅些泰扳裁祭湘趴冕薄桑卉颇评棠筹细舍烬焚馋袜玄溯C语言课件第2章-数据类型C语言课件第2章-数据类型,练习题,1、下列字符列中,可以作为“字符串常量”的是( ) ABC “ABC” abc a2、设有宏定义“#define R 2+3”,则R*R的宏替换结果正确的是( ) (2+3)*(2+3) 2+3*2+3 5*5 5.
7、0*5.0 3、下列字符列中,合法的字符常量是( ) “A” x10 0a a,臆檄需时耘傅窑克豺针控馅贷匹乘闪着泅巍赖束捶贰志辣嗓路嘶也梆奋呈C语言课件第2章-数据类型C语言课件第2章-数据类型,4、下列字符列中,非法的字符常量是( ) x 11 n x5、以下选项中非法的实型常数是( ) 3E1.0 1.0E3 2E-2 3E-26、在以字节存储字符的系统中,n 在内存占用的字节数是( )1 2 3 47、在以下字符列中,合法的长整型常数是( ) 0L 4962710 0.054838743 2.1869el0,腕杆镣苔落邓掠莲追洒汹予叹舱滓堡亦媒涎寅轮清捶锌熙淫隘森咨铜喇蝉C语言课件第2
8、章-数据类型C语言课件第2章-数据类型,2.3.2 变量其值可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储单元。在该存储单元中存放变量的值。用来标识变量名、符号常量名的有效字符序列称为标识符(identifier)。,图1,糕峻邻煽捉捕蚌榜谣捧嘘斥吴携侨蹋首惋犊迁守秉抉滇素母校由冗告邢椭C语言课件第2章-数据类型C语言课件第2章-数据类型,变量赋初值,程序中常需要对一些变量预先设置初值。C语言允许在定义变量的同时使变量初始化。如:int a=3; /* 指定a为整型变量,初值为3 */float f=3.56; /* 指定f为实型变量,初值为3.56 */char c=a
9、; /* 指定c为字符变量,初值为a */ 也可以使被定义的变量的一部分赋初值。如:int a,b,c=5;表示指定a、b、c为整型变量,只对c初始化,c的值为5。,相当于: int a,b,c; /*指定a、b、c为整型变量*/ c=5; /*将5赋给c*/,惮土崔淹掳目裴总何旁筹孜檬真悔凶琐坟社坍腊拱买才鸳览颅啪刀亦酞佛C语言课件第2章-数据类型C语言课件第2章-数据类型,如果对几个变量赋予初值3,应写成int a=3,b=3, c=3; 表示a、b、c的初值都是3。不能写成:int a=b=c=3;int a=3; 相当于: int a; /*指定a为整型变量 */a=3; /*赋值语句
10、,将3赋给a */,靳邵门币纹跌穷臂驹械赶凑爵虑婴辆啄醒顾佑斌痞佰探贩及稽神效嘿咱慑C语言课件第2章-数据类型C语言课件第2章-数据类型,在c语言中,要求对所有用到的变量作强制定义,也就是“先定义,后使用”。这样做的目的是: (1) 凡未被事先定义的,不作为变量名,这就能保证程序中变量名使用得正确。例如,如果在定义部分写了int student;而在执行语句中错写成staent。如:staent=30;在编译时检查出statent未经定义,不作为变量 名。因此输出“变量statent未经声明”的信息,便于用 户发现错误,避免变量名使用时出错。,龋迫侗桃滤沟酮谨偏慢酝杠私赶答话烟纠汇囊狱厦线搜浇
11、丰辫森续万执临C语言课件第2章-数据类型C语言课件第2章-数据类型,(2) 每一个变量被指定为一确定类型,在编译时就能为其分配相应的存储单元。如指定a、b为int型,Turbo C编译系统为a和b各分配两个字节,并按整数方式存储数据。 (3) 指定每一变量属于一个类型,这就便于在编译时,据此检查该变量所进行的运算是否合法。例如,整型变量a和b,可以进行求余运算:a%b%是“求余”,得到a/b的余数。如果将a、b指定为实型变量,则不允许进行“求余”运算,在编译时会给出有关“出错信息”。,阀竞威神趋殆孙遥肉峨守旦蟹穆综凄懦枫蝗侠士倡抒慢斥汗避肇蘸孪没淫C语言课件第2章-数据类型C语言课件第2章-数
12、据类型,例2 、 向字符变量赋以整数。main()char c1,c2;c1=97;c2=98;printf(“%c %cn“,c1,c2); /*以字符形式输出*/printf(“%d %dn“,c1,c2); /*转换为整数形式输出*/c1、c2被指定为字符变量。但在第3和第4行中,将整数97和98分别赋给c1和c2,它的作用相当于以下两个赋值语句:,咒恿捍徐妨剂丈肋酿粉趋矿茹骂渭乒谚闺嚏受捧娃捍戳痴庞内唉健驼吸蝉C语言课件第2章-数据类型C语言课件第2章-数据类型,程序运行时输出如下: ab 9798可以看到:字符型数据和整型数据是通用的。即:字符数据与整型数据可以互相赋值。它们既可以用
13、字符形式输出(用%c),也可以用整数形式输出(用%d)。c1=a;c2=b;,夕牟岗骤氛翅舵绕仟统危偷捅裸矮诱佯业锁堤汝军目迂懒洲柜佃技粒陡艇C语言课件第2章-数据类型C语言课件第2章-数据类型,练习题 1、下列变量定义语句中,正确的是(A )A: short aL=5678; B: double b=1+5e2.5; C: long do=0xfdaL; D: float 2_and=1e-3;2、以下能正确地定义整型变量a,b和c并为c赋初值5的语句是_ B _. A int a=b=c=5; B int a,b,c=5; C a=5,b=5,c=5; D a=b=c=5;,诸粘紫亏驶犊乍
14、奇栋皋秃雹嘻税芳热桂巢恃嫁雅摹暇甄难凌魁走哮粒训吐C语言课件第2章-数据类型C语言课件第2章-数据类型,3、已知ch是字符型变量,下面不正确的赋值语句是_ A _。 A ch=a+b; B ch=0; C ch=7+9; D ch=; 4、实验教程P24 (改错第1题),疏敞茁厕抑新危杆冰枢荫肮遗挎澈衍石饯桂萎陵灶奋砧听罪匹庙晚关拙谱C语言课件第2章-数据类型C语言课件第2章-数据类型,1 printf函数(格式输出函数)作用是向终端(或系统隐含指定的输出设备)输出若干个任意类型的数据(putchar只能输出字符,而且只能是一个字符,而printf可以输出多个数据,且为任意类型)。printf
15、函数的一般格式为:printf(格式控制,输出表列)如:printf(“%d, %cn“,i,c)括弧内包括两部分:,增加内容:格式输入与输出函数,砷贝宅优赃楔欧肆异桂巷既枚渝剪舵侍俗卵共疤左兢替妆煞琵胳纶题拱尝C语言课件第2章-数据类型C语言课件第2章-数据类型,(1) “格式控制”是用双引号括起来的字符串,也称“转换控制字符串”,它包括两种信息: 格式说明,由“%”和格式字符组成,如%d,%f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开始的。 普通字符,即需要原样输出的字符。例如上面printf函数中双引号内的逗号、空格和换行符。 (2) “输出表列”是需要输
16、出的一些数据,可以是表达式。,忙括偏恿皮牙移菜女同郭羔刽雕幸竹葵两熔夫冀氏扼咋殴丢历显义燕祝钮C语言课件第2章-数据类型C语言课件第2章-数据类型,常用的格式字符对不同类型的数据用不同的格式字符。常用的有以下几种格式字符: (1) d格式符。用来输出十进制整数。有以下几种用法: %d, 按整型数据的实际长度输出。 %md, m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于,则按实际位数输出。如printf(“%3d,%3d“,a,b); 若a=123,b=12335,则输出结果为:123,12335 %ld,输出长整型数据。如long a=135790;printf(“%
17、ld”,a); 如果用%d输出,就会发生错误,因为整型数据的范围为 3276832767。对long型数据应当用%ld格式输出。,滁瞩骤仰煮轩汇琶乍加攫辽敷留涎雍乌辣榨酬凉翟叼划柑枉獭朔乓台践凳C语言课件第2章-数据类型C语言课件第2章-数据类型,(2) o格式符,以八进制数形式输出整数。由于是将内存单元中的各位的值(0或1)按八进制形式输出,因此输出的数值不带符号,即将符号位也一起作为八进制数的一部分输出。例如:int a=-1;printf(“%d,%o“,a,a); -1在内存单元中的存放形式(以补码形式存放)如下:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 输出为-
18、1,177777不会输出带负号的八进制整数。同样可以指定字段宽度,如 printf(“%8o”,a) 输出为 177777。,籽愤剂刘盅椽挑焕染丝宵奇毡善舰挛碘谱授疡帮粘宰呸鼓隆红剩兹同胎汽C语言课件第2章-数据类型C语言课件第2章-数据类型,(3) x格式符,以十六进制数形式输出整数。同样不会出现负的十六进制数。例如:int a=-1;printf(“%x,%o,%d”,a,a,a); 输出结果为ffff,177777,-1 同样可以指定输出字段的宽度,如“%12x”。,糙帧姐塔骂贱甭崖升儿盘箍币堑愉饵糊都纫佳涛攀勉宗让落盂镭枯猪刺寸C语言课件第2章-数据类型C语言课件第2章-数据类型,(4
19、) u格式符,用来输出unsigned型数据,即无符号数,以十进制形式输出。 一个有符号整数(int型)也可以用%u格式输出;反之,一个unsigned型数据也可以用%d格式输出。按相互赋值的规则处理。unsigned型数据也可用%o或%x格式输出。,世衰冈维兽功躁牙批妊股耻普扎菩扛筷习苞隶攘倍柯寿熊槐沿亩功幂伸票C语言课件第2章-数据类型C语言课件第2章-数据类型,例3 、无符号数据的输出。 main()unsigned int a=65535;int b=-2;printf(“a=%d,%o,%x,%un“,a,a,a,a);printf(“b=%d,%o,%x,%un“,b,b,b,b)
20、; 运行结果为:a=-1,177777,ffff,65535b=-2,177776,fffe,65534,湖水斑甲闹贼框捍蛹跌付离涸扎蚂漓象峙艘钱笺屎售衙泻吐瘦郑囚犹兔淬C语言课件第2章-数据类型C语言课件第2章-数据类型,(5) c格式符,用来输出一个字符。如:char c=a;printf(“%c“,c); 输出字符a,请注意:“%c”中的c是格式符,逗号右边的c是变量名,不要搞混。一个整数,只要它的值在0255范围内,也可以用字符形式输出,在输出前,系统会将该整数作为ascii码转换成相应的字符;反之,一个字符数据也可以用整数形式输出。,丢葱域拍烃妊骗摧苏党播诞怔嘘森砾躯粗牧鸣湍蔬笆滤味
21、尾个色蛀蛆茬椭C语言课件第2章-数据类型C语言课件第2章-数据类型,例4、字符数据的输出。main()char c=a;int i=97; printf(“%c,%dn“,c,c);printf(“%c,%dn“,i,i); 运行结果为:a,97a,97 也可以指定输出字数宽度,如果有printf(“%3c“,c) 则输出:“ a”,即c变量输出占3列,前2列补空格。,轻再霸盗炒箩课次昧扒敬题件仍斡誉扫怖篷恋慈储聋涛雪落途概值唬兆窃C语言课件第2章-数据类型C语言课件第2章-数据类型,(6) s格式符,用来输出一个字符串。有几种用法: %s, 例如: printf(“%s”,“china”),
22、输出“china”字符串(不包括双引号)。 %ms,输出的字符串占列,如字符串本身长度大于m,则突破的限制,将字符串全部输出。若串长小于m,则左补空格。 %-ms,如果串长小于,则在列范围内,字符串向左靠,右补空格。 %mns,输出占列,但只取字符串中左端n个字符。这n个字符输出在列的右侧,左补空格。 %-mns,其中、n含义同上,n个字符输出在列范围的左侧,右补空格。如果n,则自动取n值,即保证n个字符正常输出。,酵本狸周噪践炽毫含锑嘲豪余拷魄灰阎它涨拨殿轩肮桓助雾遇掳搞伶擂残C语言课件第2章-数据类型C语言课件第2章-数据类型,例5、字符串的输出。main()printf(“%3s,%7.
23、2s,%-5.3sn”,“china“,“china“, “china“) 输出如下:china, ch,chi,年匆被莉草聘揪桔楷节侍渗囱味拙释谓恋惰贯鹏味镜婿卷交继姚当姥挪渝C语言课件第2章-数据类型C语言课件第2章-数据类型,(7) f格式符,用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法: %f,不指定字段宽度,由系统自动指定,使整数部分全部如数输出,并输出6位小数。应当注意,并非全部数字都是有效数字。单精度实数的有效位数一般为7位。,专氓荧论虞茶倘企损野茁导撩滁姐读埃购丸惫戒苦咯句仍嗅藉哇粘刃跋徊C语言课件第2章-数据类型C语言课件第2章-数据类型, %nf 指定输出
24、的数据共占列,其中有n位小数。如果数值长度小于,则左端补空格。 %-nf与%nf 基本相同,只是使输出的数值向左端靠,右端补空格。 (8) e格式符,以指数形式输出实数 例如:float i=1.0;printf(“%e”,i);输出结果为:1.00000e+00,娩梧督而胸泻姿月懊倦油昂慧接堆桂脸粪洁沤眶溢酝商环棉滴虎涛吭舟渭C语言课件第2章-数据类型C语言课件第2章-数据类型,练习题 1、输入下列命令:printf(“%5d%4dn”,1213,43); 产生输出为_1213_ _43 printf(“%c%cn”,78,79);产生输出为NO,钧央欢崩笑愧群眷罪棍弊贴园逐弧鹃醋岿娠鼎腐穴
25、郴郎促脓抉洪呼迎翰岔C语言课件第2章-数据类型C语言课件第2章-数据类型,2 scanf函数(格式输入函数) 一般形式: scanf(格式控制,地址表列)“格式控制”的含义同printf函数;“地址表列”是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。,誊樱胰栋坛舔蛙役陀提潞拦架绥栅希储渴科柒僚颈灯佰焙垮旅旧管谈颓膏C语言课件第2章-数据类型C语言课件第2章-数据类型,例 9、用scanf函数输入数据。ain()int a,b,c;scanf(“%d%d%d”,&a,&b,&c);printf(“%d,%d,%dn“,a,b,c);&a、&b、&c中的“&”是“地址运算符”,&a
26、指a在内存中的地址。上面scanf函数的作用是:按照a、b、c在内存的地址将a、b、c的值存进去。变量a、b、c的地址是在 编译连接阶段分配的。,泪五喝沽注恭远傣圈锑失奇竖哥司证多翁杉沮保退醇摹捻舌擞袄耽步赶蔬C语言课件第2章-数据类型C语言课件第2章-数据类型,使用scanf函数时应注意的问题 (1) scanf函数中的“格式控制”后面应当是变量地址,而不应是变量名。例如:如果a、b为整型变量,则scanf(“%d,%d“,a,b);是不对的,应将“a,b”改为“&a,&b”。这是c语言与其他高级语言不同之处。许多初学者常在此 出错。,驳苑罗壕双邵吉让脸蛤始桔噬桔功烙鲸况抗企趴子悠埃库摇红卒
27、一牵驾耻C语言课件第2章-数据类型C语言课件第2章-数据类型,(2) 如果在“格式控制”字符串中除了格式说明以外还有其他字符,则在输入数据时应输入与这些字符相同的字符。例如scanf(“%d,%d“,&a,&b); 输入时应如下形式:3,3注意3后面是逗号,它与scanf函数中的“格式控制”中的逗号对应。如果输入时不用逗号而用空格或其他字符是不对的:3 3 (不对)3:3 (不对) 如果是scanf(“a=%d,b=%d,c=%d”,&a,&b,&c); 输入应为以下形式:a=12,b=23,c=36,太悍啼装闪搅奸凸澜敢放赫齿鲍艘契沽谊店结题诀螺俩趴娶琳量雁鼎梭矛C语言课件第2章-数据类型C
28、语言课件第2章-数据类型,练习题 1、使用“scanf(”x=%f,y%f“,x,&y)”,要使 x,y均为1.25,正确的输入是( ) 1.25,1.25 1.25 1.25 x1.25,y1.25 X1.25 y1.25,仙袋扎弟钟邢绷成氟屏杂锣杂杖群梆贩搐磐顿更濒晰恍蠕义籍犯质材般般C语言课件第2章-数据类型C语言课件第2章-数据类型,2、程序改错#include #include main() float a,b,c,disc,x1,x2,p,q; scanf(“a=%f,b=%f,c=%f“,a,b,c); disc=bb-4ac; p=-b/(2a); q=sqrt(disc)/(
29、2a); x1=p+q; x2=p-q; printf(“nnx1=%5.2fnx2=%5.2fn“,x1,x2); ,披浑弗渝销碟淖扎荷絮阑磨彬勃侩窍掷娟饰蛔协置案闻默底垣挤粮瘟朱烬C语言课件第2章-数据类型C语言课件第2章-数据类型,3、由给出的数据输入和输出形式,程序中输入输出语句的正确内容是 【 B 】 main( ) int x; float y; printf (“ enter x, y: “) ;输入语句 输出语句 输入形式 enter x, y: 2 3.4 输出形式 x+y=5.40 A) scanf (“ %d, %f “, ,巨庄腑艰抖澈桨彪瘁腔省丘爆狡网龋宣桌鹤纺忻玲堡
30、曰符辜弗济伯旦硝倍C语言课件第2章-数据类型C语言课件第2章-数据类型,2.4 常用的运算符和表达式,1算术运算符 (+-*/%)2关系运算符 (=!=)3逻辑运算符 (!&|)4位运算符 ( |&)5赋值运算符 (=及其扩展赋值运算符)6条件运算符 ( ?:)7逗号运算符 (,)8指针运算符 (*和&)9求字节数运算符 (s i z e o f)10强制类型转换运算符 ( (类型) )11分量运算符 (-)12下标运算符 ( ),桶粟吮覆堆龚殖车萝蔼基操恃既缺东妇尝湛灿戊踏星以汀盗纪检畅植屿掐C语言课件第2章-数据类型C语言课件第2章-数据类型,2.4.1 算术运算符和算术表达式,+(加法运
31、算符,或正值运算符。如3+5、+3) -(减法运算符,或负值运算符。如5-2、-3) *(乘法运算符。如3*5) /(除法运算符。如5/3) %(模运算符,或称求余运算符,%两侧均应为整型数据,如7%4的值为3)。,粳臆揣画莆酵梗戏淑粟鳖湘盎责倔庶逛蒜诺拎汀物殿千间努贷忠江阮凳吴C语言课件第2章-数据类型C语言课件第2章-数据类型,自增、自减运算符作用是使变量的值增1或减1,如:+i,-i (在使用i之前,使i的值加(减)1)i+,i- (在使用i之后,使i的值加(减)1)粗略地看,+i和i+的作用相当于i=i+1。但+i和i+不同之处在于+i是先执行i=i+1后,再使用i的值;而i+是先使用
32、i的值后,再执行i=i+1。如果i的原值等于3,则执行下面的赋值语句: =+i;(i的值先变成4, 再赋给,j的值为4) =i+;(先将 i的值3赋给,的值为3,然后i变为4),仑淆枕溶淳晒湾佛恕颖枚凯体悔接匿邯上滴冷盐坟茅崎硝娩肋父皋捍毗甲C语言课件第2章-数据类型C语言课件第2章-数据类型,又如:i=3;printf(“%d“,+i); 输出“4”。 若改为printf(“%d“,i+); 则输出“3”。注意:自增运算符(+)和自减运算符(-),只能用于变量,而不能用于常量或表达式,如5+或(a+b)+都是不合法的。因为5是常量,常量的值不能改变。(a+b)+也不可能实现,假如a+b的值为
33、5,那么自增后得到的6放在什么地方呢?无变量可供存放。,婿踪翅坛前浸膘绍费猩彪假悠晃复凤焚现橱双芳蹈级菲拜雹扼牛扰梧康琢C语言课件第2章-数据类型C语言课件第2章-数据类型,算术运算符的优先级与结合性,新剐僵躺肌樱阐炔甜泡居液委厩融偶恭半千偷癌鞋橱旅派唇垣交狞筒碳雁C语言课件第2章-数据类型C语言课件第2章-数据类型,练习题 1、 若变量已正确定义并赋值,表达式 -k+ 等价于_A _。 A、-(k+) B、(-k)+ C、-(k+1) D、-(+k) 2、设a为5,执行下列计算后,b的值不为2的是( ) ba2 b6-( a) ba23、设整型变量 a、b、c均为2,表达式 a+b+c+ 的
34、结果是( )6 9 8 表达式出错,追留瓮禾恼屡状珊可千哦辊窍罪将谢膛屡疚诬摇直侦汹迎余耿鸿坝蓟媚辞C语言课件第2章-数据类型C语言课件第2章-数据类型,4、 设有定义“int x=8;”,则表达式“x+1/3”的值是 D 。A、0 B、2 C、3 D、8,许掐舅惺祸构铅卡叙兵芜休孤揍汛凉句羊萤髓籍旨业栏涨象码拉镑微篓迁C语言课件第2章-数据类型C语言课件第2章-数据类型,各类数值型数据间的混合运算整型(包括int,short,long)、实型(包括float,double)可以混合运算。前已述及,字符型数据可以与整型通用,因此,整型、实型、字符型数据间可以混合运算。例如: 10+a+15-8
35、7651234 *b是合法的。在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换的规则按右图所示。,筒速胃增墅冈骇珠嗣状府测碘款断锻诱羚创役庚昂香鸣朴乾旷坟谍娄药童C语言课件第2章-数据类型C语言课件第2章-数据类型,例:假设已指定i为整型变量,f为float变量,d为 double型变量,e为long型,有下面式子:10+a+i*f-d/e 在计算机执行时从左至右扫描,运算次序为: 进行10+a的运算,先将a转换成整数97,运算结果为107。 由于“*”比“+”优先,先进行i*f的运算。先将i与f都转成double型,运算结果为double型。 整数107与i*f的积相加。先
36、将整数107转换成双精度数(小数点后加若干个0,即10700000),结果为double型。 将变量e化成double型,d/e结果为double型。 将10+a+i*f的结果与d/e的商相减,结果为double型。 上述的类型转换是由系统自动进行的。,墟抒纱饰拿胺搓匀甘很预逮抉拳挽苇跪楼搽济营取愈侣长焉勋归蛇介且豌C语言课件第2章-数据类型C语言课件第2章-数据类型,强制类型转换运算符可以利用强制类型转换运算符将一个表达式转换成所需类型。其一般形式为:(类型名)(表达式) 例如:(double)a (将a转换成double类型)(int)(x+y) (将x+y的值转换成整型)(float)(
37、5%3) (将5%3的值转换成float型)注意,表达式应该用括号括起来。如果写成(int)x+y 则只将x转换成整型,然后与y相加。,闰追拣厩掉挽俩橙抗扁志画柔琅掠温觉浚执狈适贱臼皆器坷盲谓岂奢咙肿C语言课件第2章-数据类型C语言课件第2章-数据类型,需要说明的是在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。例如:(int)x (不要写成int(x)如果x原指定为float型,进行强制类型运算后得到一个int型的中间变量,它的值等于x的整数部分,而x的类型不变(仍为float型)。见下例:,磁烈抬虏胳毖傲媳津杏渡铱胆漏婆镶缅腰邦严鲁瘁岸欢程贾肚泪墨寇饶蕊C语言课件第
38、2章-数据类型C语言课件第2章-数据类型,例 :强制类型转换。main() float x;int i;x=36;i=(int)x;printf(“x=%f, i=%d“,x,i);运行结果如下:x=3.600000, i=3x类型仍为float型,值仍等于3.6。,翱被撵堆崩滁疾槛隙矮扯脓籍留链舀腔酸发袒浑彭妓纠刑移拘烷消琢净诧C语言课件第2章-数据类型C语言课件第2章-数据类型,练习题 1、若有以下定义: char a;int b;float c; double d;则表达式a*b+d-c值的类型为( ) float int char double2、 设有定义“double a=5.0
39、, b=2.5 ;”,则表达式(int) b+a/b的值是_ D _。A、3 B、4 C、3.0 D、4.0,垄郡能惕腻屑隋务汐除就抬捧苑绷浴豌窘怖斜桐虞怂偿脯歉俯摸伎泌臀瘫C语言课件第2章-数据类型C语言课件第2章-数据类型,2.4.2 赋值运算符和赋值表达式1. 赋值运算符赋值符号“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。如“a=3”的作用是执行一次赋值操作(或称赋值运算)。把常量3赋给变量a。也可以将一个表达式的值赋给一个变量。赋值运算符的结合方向为自右向左。,中兴皑鸥袖圭师晦铬米繁始茬帚盯厅奸豁梨盔搓匪呻驹椽挛颓冯岩亢搭踌C语言课件第2章-数据类型C语言课件第2章-数据类
40、型,2. 复合的赋值运算符在赋值符“=”之前加上其他运算符,可以构成复合的运算符。如果在“=”前加一个“+”运算符就成了复合运算符“+=”。例如,可以有:a+=3 等价于 a=a+3x*=y+8 等价于 x=x*(y+8)x%=3 等价于 x=x%3以“a+=3”为例来说明,它相当于使a进行一次自加(3)的操作。即先使a加3,再赋给a。同样,“x*=y+8”的作用是使x乘以(y+8),再赋给x。,艘芽遗踢只屈疏巳惑贿档箭太优矛悸被箕弥蹋杉铁罕吃娶秃炸蕴葛如每奉C语言课件第2章-数据类型C语言课件第2章-数据类型,注意,如果b是包含若干项的表达式,则相当于它有括号。如: x %= y+3 x %
41、=(y+3) x = x %(y+3) (不要错写成x=x%y+3)凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符。c语言规定可以使用10种复合赋值运算符。即:+=,-=,*=,/=,%=,=,&=,=,,址张骡珍痘瘪拿桃傲贤郡历撅陷贮沤大祝广初常脆抱诊旦铜陪流妖败约尾C语言课件第2章-数据类型C语言课件第2章-数据类型,C采用这种复合运算符,一是为了简化程序,使程序精炼,二是为了提高编译效率(这样写法与“逆波兰”式一致,有利于编译,能产生质量较高的目标代码。学过编译原理的读者对此容易理解,其他读者可不必深究)。,玩洼锯唤呼柯藻约欲鸟蛊纹哩犯耸阻葫战技律仙逸建蔼插往析至至附膜阮C语
42、言课件第2章-数据类型C语言课件第2章-数据类型,3. 赋值表达式由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。它的一般形式为如“a=5”是一个赋值表达式。对赋值表达式求解的过程是:将赋值运算符右侧的“表达式”的值赋给左侧的变量。赋值表达式的值就是被赋值的变量的值。例如,“a=5”这个赋值表达式的值为5(变量a的值也是5)。,曼域寡峰逗荣萄息真仙乐凶烩尹歼欢鹏洋荚扒甫瘫讽料电蹭话属犊且实佬C语言课件第2章-数据类型C语言课件第2章-数据类型,上述一般形式的赋值表达式中的“表达式”,又可以是一个赋值表达式。如a=(b=5)括弧内的“b=5”是一个赋值表达式,它的值等于5。“
43、a=(b=5)”相当于“b=5”和“a=b”两个赋值表达式, 因此a的值等于5,整个赋值表达式的值也等于5。赋值运算符按照“自右而左”的结合顺序,因此,“b=5”外面的括弧可以不要,即“a=(b=5)”和“a=b=5”等价,都是先求“b=5”的值(得5),然后再赋给a。,幼待匈仲抹察努擦博氟衰奥渍近嘲砧啸午注惶萎菱旬叙或骨疫叼歧状湖牧C语言课件第2章-数据类型C语言课件第2章-数据类型,下面是赋值表达式的例子:a=b=c=5 (赋值表达式值为5, a、 b、 c值均为5)a=5+(c=6) (表达式值为11,a值为11,c值为6)a=(b=4)+(c=6) (表达式值为10,a值为10,b等于
44、4,c等于6)a=(b=10)/(c=2) (表达式值为5,a等于5,b等于10,c等于2),都姿究茎箱氛壤娘挝说昭原增范报搁瑟旁道名帽犬弥苟汞陵唤儡狂扑诞般C语言课件第2章-数据类型C语言课件第2章-数据类型,赋值表达式也可以包含复合的赋值运算符。如:a+=a-=a*a 也是一个赋值表达式。 如果a的初值为12,此赋值表达式的求解步骤如下: 先进行“a-=a*a”的运算, 它相当于a=a-a*a=12-144=-122。 再进行“a+=-132”的运算,相当于a=a+(-132)=-132-132=-264。,那障消耸版惕蚤柿墅最扇每缩都韦崖钓骚社粱隆险禽哇傅习动博召萧衅墅C语言课件第2章-
45、数据类型C语言课件第2章-数据类型,练习题 1、设n,i均为整型变量,并已经赋值,以下非法的赋值表达式是_ C _。 A、n=(i-1) B、n=n+ C、i=(n+1)- D、n=i02、设x,y均为实型,n为整型,并已经赋值,以下合法的赋值表达式是_C _。 A、x=y+=100 B、x=y+1=100 C、x=(int)(n+y) D、 x+y=n,茁差琐似膛该臆客好阎亲帜郭烃窒巍食鸽乌卸策尊旨坝元夯匡云拎擎糕炼C语言课件第2章-数据类型C语言课件第2章-数据类型,2.4.3 逗号运算符和逗号表达式C语言提供一种特殊的运算符逗号运算符。用它将两个表达式连接起来。如:3+5,6+8逗号表达
46、式的一般形式为:表达式1,表达式2逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。例如,上面的逗号表达式“3+5,6+8”的值为14。,月叁底索陪累慎挺队吃哼羹延单衷忙巾煞辨密鸟墒退隆益坦极谈第囤赁铸C语言课件第2章-数据类型C语言课件第2章-数据类型,又如,逗号表达式: a=3*5,a*4对此表达式的求解,读者可能会有两种不同的理解:一种认为“3*5,a*4” 是一个逗号表达式,先求出此逗号表达式的值, 如果a的原值为3,则逗号表达式的值为12,将12赋给a, 因此最后a的值为12。另一种认为:“a=3*5”是一个赋值表达式”,“a*4”是另一个表达
47、式,二者用逗号相连,构成一个逗号表达式。这两者哪一个对呢?赋值运算符的优先级别高于逗号运算符, 因此应先求解a=3*5(也就是把“a=3*5”作为一个表达式)。经计算和赋值后得到a的值为15,然后求解a*4,得60。整个逗号表达式的值为60。,沽活盒吧菜逼伴号抄反写投雌橙球夫愚概钝兔碳蛤尘改鹃沤描叮圈舔蕾殉C语言课件第2章-数据类型C语言课件第2章-数据类型,一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式,如(a=3*5,a*4),a+5 先计算出a的值等于15,再进行a*4的运算得60(但a值未变,仍为15),再进行a+5得20,即整个表达式的值为20。逗号表达式的一般形式可以扩展
48、为表达式1,表达式2,表达式3表达式n它的值为表达式n的值。,喊拿乞柑理靡膀惦蜂岔锦凯貌溪则肢隆洒旭形脓舆很版曾蒜牛衣夏用超朴C语言课件第2章-数据类型C语言课件第2章-数据类型,逗号运算符是所有运算符中级别最低的。因此,下面两个表达式的作用是不同的: x=(a=3,6*3) x=a=3,6*a第个是一个赋值表达式,将一个逗号表达式的值赋给x,x的值等于18。第个是逗号表达式,它包括一个赋值表达式和一个算术表达式,x的值为3。其实,逗号表达式无非是把若干个表达式“串联”起来。在许多情况下,使用逗号表达式的目的只是想分别得到各个表达式的值,而并非一定需要得到和使用整个逗号表达式的值,逗号表达式最常用于循环语句(for语句)中。,