版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1续续6.6.变量变量(binling)(binling)赋值赋值7.7.不同不同(b tn(b tn) )类型数据混合运类型数据混合运算算8.8.算术算术(sunsh)(sunsh)运算符与表达运算符与表达式式9.9.赋值运算符与表达式赋值运算符与表达式10.10.逗号运算符与表达式逗号运算符与表达式第2页/共88页第1页/共88页第一页,共89页。2 原码、反码和补码原码、反码和补码 原码:最高位为符号位,其余各位为数值本身原码:最高位为符号位,其余各位为数值本身(bnshn)(bnshn)的的绝对值绝对值 反码:反码: 正数:反码与原码相同正数:反码与原码相同 负数:符号位为负数:符号位
2、为1 1,其余位对原码取反,其余位对原码取反 补码:补码: 正数:原码、反码、补码相同正数:原码、反码、补码相同 负数:最高位为负数:最高位为1 1,其余位为原码取反,再对整个数加,其余位为原码取反,再对整个数加1 12.0 数值数值(shz)表示方法表示方法第3页/共88页第2页/共88页第二页,共89页。3续续 补码的设计目的补码的设计目的: : 使符号位能与有效值部分一起参加运算使符号位能与有效值部分一起参加运算, ,从而简化计算机的运算规则。从而简化计算机的运算规则。 使减法运算转换为加法运算使减法运算转换为加法运算, ,进一步简化计算机中运算器的线路设计。进一步简化计算机中运算器的线
3、路设计。 需要注意的是:所有转换都是在计算机的最底层进行的,而在我们使用的汇编、需要注意的是:所有转换都是在计算机的最底层进行的,而在我们使用的汇编、C C等其他等其他(qt)(qt)高级语言高级语言中使用的都是原码。中使用的都是原码。第4页/共88页第3页/共88页第三页,共89页。4原码反码补码+7000001110000011100000111-7100001111111100011111001+0000000000000000000000000-0100000001111111100000000数的范围0111111111111111(-127+127)0111111110000000
4、(-127+127)0111111110000000(-128+127)(用一字节表示数)(用一字节表示数)第5页/共88页第4页/共88页第四页,共89页。52.1 C的数据类型的数据类型数据类型决定(judng):1. 数据占内存字节数;2. 数据取值范围;3. 其上可进行的操作第6页/共88页第5页/共88页第五页,共89页。62.2 常量常量(chngling)与变量与变量2.2.1 常量和符号常量常量和符号常量在程序运行过程中在程序运行过程中,其值不能被改变的量称为常量其值不能被改变的量称为常量常量区分为不同常量区分为不同(b tn)的类型:的类型:整型 100,125,-100,0
5、实型 3.14 , 0.125,-3.789字符(z f)型 a, b,2字符(z f)串 a, ab,1232直接常量第7页/共88页第6页/共88页第六页,共89页。7例例2.1 符号符号(fho)常量的使用常量的使用#define PRICE 30#include void main ( ) int num, total; num=10; total=num * PRICE; printf(total=%dn,total); 运行运行(ynxng)(ynxng)结果:结果: total=300 total=300 程序中用#define命令行定义PRICE代表常量30,此后凡在本文件中出
6、现的PRICE都代表30,可以和常量一样进行运算如再用赋值语句给PRICE赋值是错的 PRICE=40;/* 错误,不能给符号常量赋值第8页/共88页第7页/共88页第七页,共89页。82.2 常量常量(chngling)与变量与变量2.2.2变量变量变量代表变量代表(dibio)内存中具有特定属性的一个存储单元,它用来存内存中具有特定属性的一个存储单元,它用来存放数据,这就是变量的值,在程序运行期间,这些值是可以改变放数据,这就是变量的值,在程序运行期间,这些值是可以改变的。的。变量名实际上是一个以一个名字对应代表变量名实际上是一个以一个名字对应代表(dibio)一个地址,在对一个地址,在对
7、程序编译连接时由编译系统给每一个变量名分配对应的内存地址。程序编译连接时由编译系统给每一个变量名分配对应的内存地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。存储单元中读取数据。第9页/共88页第8页/共88页第八页,共89页。9 变量命名的规定:语言规定标识符只能由字母、数字(shz)和下划线三种字符组成,且第一个字符必须为字母或下划线。 例:sum,_total, month, Student_name, lotus_1_2_,BASIC, li_ling M.D.John, ¥123,3D64,ab
8、 2.2 常量常量(chngling)与变量与变量第10页/共88页第9页/共88页第九页,共89页。102.2 常量常量(chngling)与变量与变量第11页/共88页第10页/共88页第十页,共89页。112.3.1整型常量的表示方法整型常量的表示方法 整型常量即整常数。在语言中,整常数可用以下三种形式整型常量即整常数。在语言中,整常数可用以下三种形式表示:表示:(1)十进制整数。十进制整数。 如:如:123, -456, 4。(2)八进制整数。以八进制整数。以0开头的数是八进制数。开头的数是八进制数。 如:如:0123表示八进制数表示八进制数123,等于十进制数,等于十进制数83,-0
9、11表示八表示八进制数进制数-11,即十进制数即十进制数-9。(3)十六进制十六进制(sh li jn zh)整数。以整数。以0 x开头的数是开头的数是16进制数。进制数。 如:如:0 x123,代表,代表16进制数进制数123,等于十进制数等于十进制数 291。 -0 x12等于十进制数等于十进制数102.3 整型数据整型数据(shj)第12页/共88页第11页/共88页第十一页,共89页。122.3.2 整型变量整型变量 (1)整型数据在内存中的存放形式整型数据在内存中的存放形式 数据在内存中是以二进制形式存放的。数据在内存中是以二进制形式存放的。 如如: int i ; /* 定义定义(
10、dngy)为整型变量为整型变量 */ i=10 ; /* 给给i赋以整数赋以整数10 */ 2.3 整型数据(shj)第13页/共88页第12页/共88页第十二页,共89页。13(2)(2)整型变量整型变量(binling)(binling)的分类的分类共六种共六种有符号基本整型有符号短整型有符号长整型无符号基本整型无符号短整型无符号长整型(signed)int (signed)short (int )(signed) long (int)unsigned intunsigned short (int)unsigned long (int) 注意注意:括号表示其中的内容是可选的.2.3 整型数
11、据整型数据(shj)第14页/共88页第13页/共88页第十三页,共89页。14v整数类型的有关(yugun)数据:2.3 整型数据整型数据(shj)第15页/共88页第14页/共88页第十四页,共89页。15例如:整数13在内存中实际(shj)存放的情况:2.3 整型数据整型数据(shj)第16页/共88页第15页/共88页第十五页,共89页。16(3)(3)整型变量的定义整型变量的定义: : 规定规定(gudng)(gudng)在程序中所有用到的变量都必须在程在程序中所有用到的变量都必须在程序中定义,即序中定义,即“强制类型定义强制类型定义”。 例如例如: : int a,b int a,
12、b(指定变量、为整型)(指定变量、为整型) unsigned short c,d; unsigned short c,d;(指定变量、为无符号短整(指定变量、为无符号短整型)型) long e,f;( long e,f;(指定变量、为长整型)指定变量、为长整型)2.3 整型数据整型数据(shj)第17页/共88页第16页/共88页第十六页,共89页。17例例2.2 整型变量的定义与使用整型变量的定义与使用#include void main()() int a,b,c,d; /*指定指定(zhdng)、为整型变量、为整型变量* unsigned ; *指定指定(zhdng)为无符号整型变量为无
13、符号整型变量* 12;-24;10; ; printf(,);,); 运行运行(ynxng)(ynxng)结果:结果: , 2.3 整型数据整型数据第18页/共88页第17页/共88页第十七页,共89页。18例例2.3 整型数据整型数据(shj)的溢出的溢出#include void main()int a,b; a=32767; b=a+1; printf(“%d,%dn”,a,b);运行运行(ynxng)(ynxng)结果:结果: 32767,-32768 32767,-327682.3 整型数据整型数据第19页/共88页第18页/共88页第十八页,共89页。19 在C中,用高位置1来表示
14、负数,int型占两个字节共16位,32768的二进制是10000000,00000000,高位为1,系统会认为是负数,所以32768需要用长型表示,占四个字节。最高位就不是1了。(00000000,00000000,10000000,00000000) -32768在内存(ni cn)中的表示是10000000,00000000。过程是:-32768原码( 10000000,00000000,10000000,00000000 ), 符号位不变其余取反(11111111,11111111,01111111,11111111), 再加1(11111111,11111111,10000000,00
15、000000) 2.3 整型数据整型数据(shj)第20页/共88页第19页/共88页第十九页,共89页。202.3 整型数据整型数据(shj)第21页/共88页第20页/共88页第二十页,共89页。212.3.3 整型常量的类型整型常量的类型(1)一个整数,如果其值在一个整数,如果其值在-32768+32767范围内,认为范围内,认为(rnwi)它是它是int型,它可以赋值给型,它可以赋值给int型和型和long int型变量。型变量。(2)一个整数,如果其值超过了上述范围,而在一个整数,如果其值超过了上述范围,而在-2147483637+2147483647范围内,则认为范围内,则认为(r
16、nwi)它是为长整型。可以将它是为长整型。可以将它赋值给一个它赋值给一个long int型变量。型变量。(3)如果所用的如果所用的C版本(如版本(如Turbo C)分配给)分配给short int与与int型数据型数据在内存中占据的长度相同,则它的表数范围与在内存中占据的长度相同,则它的表数范围与int型相同。因此型相同。因此一个一个int型的常量同时也是一个型的常量同时也是一个short int型常量,可以赋给型常量,可以赋给int型型或或short int型变量。型变量。 2.3 整型数据整型数据(shj)第22页/共88页第21页/共88页第二十一页,共89页。22(4) (4) 一个整
17、常量后面加一个字母一个整常量后面加一个字母u u或或U U,认为是,认为是unsigned intunsigned int型,如型,如12345u12345u,在内存中按,在内存中按unsigned intunsigned int规定的方式存放规定的方式存放( (存储单元中最高位不作为符号位,而用来存储单元中最高位不作为符号位,而用来(yn(yn li) li)存储数据存储数据) )。如果写成。如果写成-12345u-12345u,则先将,则先将-12345-12345转换成其补转换成其补码码5319153191,然后按无符号数存储。,然后按无符号数存储。2.3 整型数据整型数据(shj)第2
18、3页/共88页第22页/共88页第二十二页,共89页。23Unsigned int 占2个字节(z ji)(16位)。12345二进制-12345二进制(补码(b m))原:补:Unsigned:=53191第24页/共88页第23页/共88页第二十三页,共89页。24(5) (5) 在一个整常量后面加一个字母在一个整常量后面加一个字母(zm)l(zm)l或或L L,则认,则认为是为是long intlong int型常量。型常量。 例如:例如: 123l.432L.0L 123l.432L.0L 用于函数调用中,如果函数的形参为用于函数调用中,如果函数的形参为long intlong int
19、型,则型,则要求实参也为要求实参也为long intlong int型。型。2.3 整型数据整型数据(shj)第25页/共88页第24页/共88页第二十四页,共89页。25 2.4 浮点型数据浮点型数据(shj)2.4.12.4.1浮点型常量浮点型常量(chngling)(chngling)的表示方法的表示方法两种表两种表示形式示形式(xngsh)小数小数 0.123注意注意: :字母e(或E)之前必须有数字,且e后面的指数必须为整数 指数指数 3e-3第26页/共88页第25页/共88页第二十五页,共89页。26规范化的指数形式:规范化的指数形式: 在字母在字母(zm)e(zm)e(或(或E
20、 E)之前的小数部分中,小数点左边)之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字应有一位(且只能有一位)非零的数字. . 例如例如: 123.456: 123.456可以表示为:可以表示为: 123.456e0, 12.3456e1, 1.23456e2, 0.123456e3, 123.456e0, 12.3456e1, 1.23456e2, 0.123456e3, 0.0123456e4, 0.00123456e0.0123456e4, 0.00123456e 其中的其中的1.23456e21.23456e2称为称为“规范化的指数形式规范化的指数形式”。 2.4 浮点型数
21、据浮点型数据(shj)第27页/共88页第26页/共88页第二十六页,共89页。272.4.2 浮点型变量浮点型变量(1)浮点型数据在内存中的存放形式浮点型数据在内存中的存放形式 一个浮点型数据一般在内存中占一个浮点型数据一般在内存中占4个字节个字节(32位位)。与整型数据的存。与整型数据的存储方式不同,浮点型数据是按照指数储方式不同,浮点型数据是按照指数(zhsh)形式存储的。系统形式存储的。系统把一个浮点型数据分成小数部分和指数把一个浮点型数据分成小数部分和指数(zhsh)部分,分别存放。部分,分别存放。指数指数(zhsh)部分采用规范化的指数部分采用规范化的指数(zhsh)形式。形式。
22、2.4 浮点型数据浮点型数据(shj)第28页/共88页第27页/共88页第二十七页,共89页。28(2) (2) 浮点型变量浮点型变量(binling)(binling)的分类的分类 浮点型变量浮点型变量(binling)(binling)分为单精度(分为单精度(floatfloat型)、双型)、双精度(精度(doubledouble型)和长双精度型(型)和长双精度型(long doublelong double)三类形式。)三类形式。 2.4 浮点型数据浮点型数据(shj)第29页/共88页第28页/共88页第二十八页,共89页。29 2.4 浮点型数据浮点型数据(shj)第30页/共88
23、页第29页/共88页第二十九页,共89页。30例例2.4 浮点型数据浮点型数据(shj)的舍入误差的舍入误差#include void main() float a,b; a = 123456.789e5; b = a + 20 ; printf(“%fn”,b); 运行运行(ynxng)(ynxng)结果:结果: 123456.789e5 123456.789e5 2.4 浮点型数据浮点型数据第31页/共88页第30页/共88页第三十页,共89页。312.4.3 浮点型常量浮点型常量(chngling)的类型的类型 C编译系统将浮点型常量编译系统将浮点型常量(chngling)作为双精度来处
24、理。作为双精度来处理。 例如:例如:f = 2.45678 * 4523.65 系统先把系统先把2.45678和和4523.65作为双精度数,然后进行相乘的运算,作为双精度数,然后进行相乘的运算,得到的乘也是一个双精度数。最后取其前得到的乘也是一个双精度数。最后取其前7位赋给浮点型变量位赋给浮点型变量f。如。如是在数的后面加字母是在数的后面加字母f或或F(如(如1.65f, 654.87F),这样编译系统就会),这样编译系统就会把它们按单精度(把它们按单精度(32位)处理。位)处理。 2.4 浮点型数据浮点型数据(shj)第32页/共88页第31页/共88页第三十一页,共89页。322.5 字
25、符字符(z f)型数据型数据 2.5.1 字符字符(z f)常量常量(1)用单引号包含的一个字符用单引号包含的一个字符(z f)是字符是字符(z f)型常量型常量(2)只能包含一个字符只能包含一个字符(z f)a a, ,A A, , 1 1abcabc、“a a”第33页/共88页第32页/共88页第三十二页,共89页。332.5.2 字符变量字符变量字符型变量用来存放字符常量,注意只能放一个字符。字符型变量用来存放字符常量,注意只能放一个字符。字符变量的定义形式如下:字符变量的定义形式如下:char c1,c2;可以用下面可以用下面(xi mian)语句对语句对c1,c2赋值:赋值: c1
26、a;c2 b ;一个字符变量在内存中占一个字节。一个字符变量在内存中占一个字节。 2.5 字符字符(z f)型数据型数据 第34页/共88页第33页/共88页第三十三页,共89页。342.5.3 字符数据在内存中的存储形式及其使用方法字符数据在内存中的存储形式及其使用方法一个字符常量存放到一个字符变量中,实际上并不是一个字符常量存放到一个字符变量中,实际上并不是(b shi)把把该字符的字型放到内存中去,而是将该字符的相应的该字符的字型放到内存中去,而是将该字符的相应的ASCII代代码放到存储单元中。这样使字符型数据和整型数据之间可以通码放到存储单元中。这样使字符型数据和整型数据之间可以通用。
27、用。注意(zh y): 一个字符数据既可以以字符形式输出,也可以以整数形式输出。2.5 字符字符(z f)型数据型数据 第35页/共88页第34页/共88页第三十四页,共89页。35例例2.6 向字符向字符(z f)变量赋以整数。变量赋以整数。 #include void main() char c1,c2; c1=97; c2=98; printf(“%c %cn”,c1,c2); printf(“%d %dn”,c1,c2); v 运行运行(ynxng)(ynxng)结结果:果:v v 97 98 97 98第36页/共88页第35页/共88页第三十五页,共89页。36例例2.7 大小写字
28、母的转换大小写字母的转换(zhunhun) #include void main() char c1,c2; c1=a; c2=b;c1=c1-32;c2=c2-32; printf(“c c,c1,c2);); v 运行运行(ynxng)(ynxng)结果:结果: v 第37页/共88页第36页/共88页第三十六页,共89页。372.5 字符字符(z f)型数据型数据 第38页/共88页第37页/共88页第三十七页,共89页。382.5.4 字符串常量字符串常量(chngling)字符串常量字符串常量(chngling)是一对双撇号括起来的字符序列是一对双撇号括起来的字符序列.合法的字符串常
29、量合法的字符串常量(chngling):“How do you do.”, “CHINA”, “a” , “$123.45”可以输出一个字符串,如可以输出一个字符串,如printf(“How do you do.”);2.5 字符字符(z f)型数据型数据 第39页/共88页第38页/共88页第三十八页,共89页。39 是字符常量(chngling),”是字符串常量(chngling),二者不同。 如:假设被指定为字符变量 :char cc=a; ”a”;c”CHINA”; v 结论:不能把一个字符串常量(chngling)赋给一个字符变量。2.5 字符字符(z f)型数据型数据 第40页/共
30、88页第39页/共88页第三十九页,共89页。40v规定:在每一个字符串常量的结尾规定:在每一个字符串常量的结尾(jiwi)(jiwi)加加一个一个 “ “字符字符v串结束标志串结束标志”,以便系统据此判断字符串是否结束。,以便系统据此判断字符串是否结束。v规定以字符规定以字符作为字符串结束标志。作为字符串结束标志。 如:如果(rgu)有一个字符串常量” ,实际上在内存中是:CHINA0 它占内存单元(dnyun)不是个字符,而是个字符,最后一个字符为。但在输出时不输出。2.5 字符型数据字符型数据 第41页/共88页第40页/共88页第四十页,共89页。412.6 变量变量(binling)
31、赋初值赋初值 (1)语言允许(ynx)在定义变量的同时使变量初始化如: int a=3; / 指定为整型变量,初值为 float f=3.56; / 指定为浮点型变量,初值为.56 char c= a; / 指定为字符变量,初值为a 第42页/共88页第41页/共88页第四十一页,共89页。42(2)可以使被定义的变量的一部分赋初值。 如: int a,b,c=5; 表示指定、为整型变量,但只对初始化,c的初值为(3)如果(rgu)对几个变量赋以同一个初值, 应写成:int a=3,b=3,c=3; 表示、的初值都是。不能写成 int a=b=c=3; 注意(zh y):初始化不是在编译阶段完
32、成的而是在程序运行时执行本函数时赋初值的,相当于有一个赋值语句。2.6 变量变量(binling)赋初值赋初值 第43页/共88页第42页/共88页第四十二页,共89页。432.7 各类数值型数据各类数值型数据(shj)间的间的混合运算混合运算 混合运算:整型(包括混合运算:整型(包括int,short,longint,short,long)、浮点型(包括)、浮点型(包括float,doublefloat,double)可以)可以(ky)(ky)混合运算。在进行运算时,不混合运算。在进行运算时,不同类型的数据要先转换成同一类型同类型的数据要先转换成同一类型, ,然后进行运算然后进行运算. .说
33、明: 这种类型转换是由系统(xtng)自动进行的。第44页/共88页第43页/共88页第四十三页,共89页。442.8 算术算术(sunsh)运算符和运算符和算术算术(sunsh)表达式表达式2.8.1 运算符简介运算符简介 的运算符有以下几类:的运算符有以下几类:(1)算术算术(sunsh)运算符运算符 (+ - * / %)(2)关系运算符关系运算符 (!)(!)(3)逻辑运算符逻辑运算符 (!(!|)(4)位运算符位运算符 ( |)(5)赋值运算符赋值运算符 (及其扩展赋值运算符)(及其扩展赋值运算符)(6)条件运算符条件运算符 (?:)(?:)(7)逗号运算符逗号运算符 (,),)(8
34、)指针运算符 (*和)(9)求字节数运算符()(10)强制类型转换运算符( (类型) )(11)分量运算符(-)(12)下标(xi bio)运算符()(13)其他 (如函数调用运算符()第45页/共88页第44页/共88页第四十四页,共89页。452.8.2 算术运算符和算术表达式算术运算符和算术表达式 (1)基本的算术运算符基本的算术运算符: (加法运算符,或正值运算符。如(加法运算符,或正值运算符。如:、)、) (减法运算符,或负值运算符。如(减法运算符,或负值运算符。如:、)、)* (乘法运算符。如(乘法运算符。如:*) (除法运算符。如(除法运算符。如:) (模运算符,或称求余运算符,
35、两侧(模运算符,或称求余运算符,两侧(lin c)均应为整型数据,均应为整型数据,如如:的值为)。的值为)。2.8 算术算术(sunsh)运算符和算术运算符和算术(sunsh)表达式表达式第46页/共88页第45页/共88页第四十五页,共89页。46(2) (2) 算术表达式和运算符的优先级与结合性基本的算术运算符算术表达式和运算符的优先级与结合性基本的算术运算符: : 用算术运算符和括号将运算对象用算术运算符和括号将运算对象( (也称操作数)连接起来也称操作数)连接起来的、符合语法规则的式子,称为算术表达式。运算的、符合语法规则的式子,称为算术表达式。运算对象包括常量、变量、函数等。对象包括
36、常量、变量、函数等。 例如例如: : * *.5.5aa 是一个是一个(y (y )合法的表达式合法的表达式2.8 算术算术(sunsh)运算符和算术运算符和算术(sunsh)表达式表达式第47页/共88页第46页/共88页第四十六页,共89页。47语言规定了运算符的优先级和结合性。 在表达式求值时,先按运算符的优先级别高低次序执行,例如先乘除后加减。 规定了各种( zhn)运算符的结合方向(结合性) 算术运算符的结合方向为“自左至右”,即先左后右 。2.8 算术算术(sunsh)运算符和算术运算符和算术(sunsh)表达式表达式第48页/共88页第47页/共88页第四十七页,共89页。48(
37、3)(3)强制类型转换运算符强制类型转换运算符 可以利用强制类型转换运算符将一个表达式转换成可以利用强制类型转换运算符将一个表达式转换成所需类型。所需类型。 一般一般(ybn)(ybn)形式形式: :(类型名)(表达式)(类型名)(表达式)例如:例如:(double)(double) 将转换成将转换成doubledouble类型类型(int)(x+y) (int)(x+y) 将将x+yx+y的值转换成整型的值转换成整型(float)(float)(5%35%3) 将将5%35%3的值转换成的值转换成floatfloat型型2.8 算术算术(sunsh)运算符和算术运算符和算术(sunsh)表达
38、式表达式第49页/共88页第48页/共88页第四十八页,共89页。49例例2.8 强制强制(qingzh)类型转换。类型转换。 #include void ()() float ; int ; ; (int);); printf(x=%f, i=%dn,x,i);v 运行运行(ynxng)(ynxng)结果:结果:v x x3.6000003.600000, i=3 i=3第50页/共88页第49页/共88页第四十九页,共89页。50(4) (4) 自增、自减运算符自增、自减运算符 作用作用(zuyng)(zuyng)是使变量的值增或减。是使变量的值增或减。如:如: ,(在使用之前,先使的值加
39、,(在使用之前,先使的值加 (减)(减),(在使用之后,使的值加(,(在使用之后,使的值加( 减)减) 2.8 算术算术(sunsh)运算符和算术运算符和算术(sunsh)表达式表达式第51页/共88页第50页/共88页第五十页,共89页。51i+i+与与+i+i的区别:的区别: 是先执行是先执行(zhxng)(zhxng)后,再使用的值;后,再使用的值; 是先使用的值后,再执行是先使用的值后,再执行(zhxng)(zhxng)。例如:例如: ; i i的值先变成的值先变成4, 4, 再赋给再赋给,j,j的值均为的值均为 ; 先将先将 i i的值的值3 3赋给赋给, ,的值为,然后变为的值为,
40、然后变为2.8 算术算术(sunsh)运算符和算术运算符和算术(sunsh)表达式表达式第52页/共88页第51页/共88页第五十一页,共89页。52注意:注意: (1)自增运算符(),自减运算符(),只能自增运算符(),自减运算符(),只能(zh nn)用于用于变量,而不能用于常量或表达式,变量,而不能用于常量或表达式, (2)和的结合方向是和的结合方向是“自右至左自右至左”。 自增(减)运算符常用于循环语句中使循环变量自动加。也用于指针变量,使指针指向下一个(y )地址 2.8 算术算术(sunsh)运算符和算术运算符和算术(sunsh)表达式表达式第53页/共88页第52页/共88页第五
41、十二页,共89页。53(5) (5) 有关表达式使用中的问题说明有关表达式使用中的问题说明 ANSI CANSI C并没有具体规定表达式中的子表达式的求值顺序,允并没有具体规定表达式中的子表达式的求值顺序,允许各编译系统自己安排。许各编译系统自己安排。 例如:对表达式例如:对表达式 a = f1( )+f2( ) a = f1( )+f2( ) 并不是所有的编译系统都先调用并不是所有的编译系统都先调用f1( )f1( ), 然后然后(rnhu)(rnhu)调用调用f2( )f2( )。在有的情况下结果可能不同。有时会出现一些令人。在有的情况下结果可能不同。有时会出现一些令人容易搞混的问题,因此
42、务必要小心谨慎。容易搞混的问题,因此务必要小心谨慎。 2.8 算术算术(sunsh)运算符和算术运算符和算术(sunsh)表达式表达式第54页/共88页第53页/共88页第五十三页,共89页。54语言中有的运算符为一个字符,有的运算符由两个字符组成 ,为避免误解(wji),最好采取大家都能理解的写法。 例如:不要写成i+j的形式,而应写成(i+)+j的形式 2.8 算术算术(sunsh)运算符和算术运算符和算术(sunsh)表达式表达式第55页/共88页第54页/共88页第五十四页,共89页。55在调用函数时,实参数的求值顺序,标准并无统一规定。例如:的初值为,如果有下面的函数调用: prin
43、tf(,i+) 在有的系统中,从左至右求值,输出“,”。在多数系统中对函数参数的求值顺序是自右而左,printf函数输出的是“,”。以上这种写法不宜提倡, 最好(zu ho)改写成: j = i+; printf(%d, %d, j,i)不要写出别人看不懂的也不知道系统(xtng)会怎样执行程序2.8 算术算术(sunsh)运算符和算术运算符和算术(sunsh)表达式表达式第56页/共88页第55页/共88页第五十五页,共89页。562.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 (1)(1)赋值运算符赋值运算符 赋值符号赋值符号“”就是赋值运算符,它的作用是将一个数据赋给一就是赋值运算
44、符,它的作用是将一个数据赋给一个变量。如个变量。如“”的作用是执行一次赋值操作(或称赋的作用是执行一次赋值操作(或称赋值运算)。把常量赋给变量。也可以将一个表达式的值值运算)。把常量赋给变量。也可以将一个表达式的值赋给一个变量赋给一个变量. .(2)(2)类型转换类型转换 如果赋值运算符两侧如果赋值运算符两侧(lin(lin c) c)的类型不一致,但都是数值型的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。或字符型时,在赋值时要进行类型转换。第57页/共88页第56页/共88页第五十六页,共89页。57将浮点型数据(shj)(包括单、双精度)赋给整型变量时,舍弃浮点数的小数部分
45、。如:为整型变量,执行“i=3.56”的结果是使的值为,以整数形式存储在整型变量中. 将整型数据(shj)赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中 如: 将23赋给float变量,即执行23,先将23转换成23.00000,再存储在中。将23赋给double型变量,即执行23,系统将23补足有效位数字为2300000000000000,然后以双精度浮点数形式存储到变量中。 2.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 第58页/共88页第57页/共88页第五十七页,共89页。58将一个double型数据赋给float变量时,截取其前面7位有效数字,存放到float变量
46、的存储单元(4个字节)中。但应注意数值范围不能溢出。 如:float f;double d=123.456789e100; f=d; 就出现(chxin)溢出的错误。 如果将一个float型数据赋给double变量时,数值不变,有效位数扩展到16位,在内存中以8个字节存储字符型数据赋给整型变量时,由于字符只占1个字节,而整型变量为个字节,因此将字符数据(个二进位)放到整型变量存储单元的低位中。2.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 第59页/共88页第58页/共88页第五十八页,共89页。59第一种情况:低位对应、高位补零 若所用系统将字符处理为无符号字符类型,或程序已将字符变量
47、(binling)定义为unsigned char型,则将字符的位放到整型变量(binling)低位,高位补零。例如:将字符376赋给int型变量(binling)第二种情况:符号扩展 若所用系统(xtng)将字符处理为带符号(signed char)时,若字符最高位为,则整型变量高位补;若字符最高位为,则高位全补。这称为“符号扩展”,这样做的目的是使数值保持不变,如变量(字符376)以整数形式输出为,的值也是。第60页/共88页第59页/共88页第五十九页,共89页。60将一个int、short、long型数据赋给一个char型变量时,只将其低8位原封不动(yun fng b dng)地送到
48、char型变量(即截断)。例:int i=289;char c=a;c=i;c的值为33,如果用“%c”输出c,将得到(d do)字符“!” !的ASCII码为33。 赋值情况赋值情况(qngkung) :2.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 第61页/共88页第60页/共88页第六十页,共89页。61将带符号的整型数据(int型)赋给long型变量时,要进行符号扩展,将整型数的16位送到long型低16位中:如果(rgu)int型数据为正值(符号位为),则long型变量的高16位补;如果(rgu)int型变量为负值(符号位为),则long型变量的高16位补,以保持数值不改变。
49、 反之,若将一个long型数据赋给一个int型变量,只将long型数据中低16位原封不动地送到整型变量(即截断)。 2.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 第62页/共88页第61页/共88页第六十一页,共89页。62例如例如(lr):int a;long b;a=b 赋值如赋值如 :如果(rgu)65536,则赋值后值为。2.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 第63页/共88页第62页/共88页第六十二页,共89页。63将unsigned int型数据赋给long int型变量时,不存在(cnzi)符号扩展问题,只需将高位补即可。将一个unsigned类型数据赋
50、给一个占字节数相同的非unsigned型整型变量(例如:unsigned int-int,unsigned long-long,unsigned short-short),将unsigned型变量的内容原样送到非unsigned型变量中,但如果数据范围超过相应整型的范围,则会出现数据错误。2.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 第64页/共88页第63页/共88页第六十三页,共89页。64例如例如(lr):unsigned int 65535; int b;;将整个送到中,由于是int,第位是符号位,因此b成了负数(fsh)。根据补码知识可知,的值为-1,可以用printf(%d
51、,b);来验证。 2.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 第65页/共88页第64页/共88页第六十四页,共89页。65 将非unsigned型数据赋给长度相同的unsigned型变量,也是原样照赋(符号位也作为(zuwi)数值一起传送)。2.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 第66页/共88页第65页/共88页第六十五页,共89页。66例例2.9 有符号有符号(fho)数据传送给无符号数据传送给无符号(fho)变量。变量。 #include void main()() unsigned ; int ; ; print(n,);,); 运行运行(ynxng)(yn
52、xng)结果:结果: 第67页/共88页第66页/共88页第六十六页,共89页。67 (3) (3) 复合的赋值运算符复合的赋值运算符 在赋值符在赋值符“”之前加上其他运算符,可以构成之前加上其他运算符,可以构成(guchng)(guchng)复合的复合的运算符。运算符。例如例如: : 等价于等价于 * * 等价于等价于 * *()() 等价于等价于 2.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 第68页/共88页第67页/共88页第六十七页,共89页。68为便于记忆,可以这样理解:为便于记忆,可以这样理解: a += b (其中其中a为变量,为变量,b为表达式为表达式) a += b
53、 (将有下划线的(将有下划线的“a+”移到移到“=”右侧)右侧) a = a + b (在(在“=”左侧补上变量名左侧补上变量名a)注意注意:如果如果(rgu)是包含若干项的表达式,则相当于它有括是包含若干项的表达式,则相当于它有括号。号。 x %= y+3 x %= (y+3) x = x %(y+3)(不要错写成不要错写成x=x%y+3) 2.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 第69页/共88页第68页/共88页第六十八页,共89页。69(4) (4) 赋值表达式赋值表达式 由赋值运算符将一个变量和一个表达式连接起来的式由赋值运算符将一个变量和一个表达式连接起来的式子称为子
54、称为“赋值表达式赋值表达式”。一般形式一般形式(xngsh)(xngsh)为为: : 例如例如: “: “5”5”是一个赋值表达式是一个赋值表达式 2.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 第70页/共88页第69页/共88页第六十九页,共89页。70对赋值表达式求解的过程对赋值表达式求解的过程(guchng)是:是: 求赋值运算符右侧的求赋值运算符右侧的“表达式表达式”的值的值; 赋给赋值运算符左侧的变量。赋给赋值运算符左侧的变量。例如例如: 赋值表达式赋值表达式“=3*5”的值为的值为15,执行表达式后,变量,执行表达式后,变量a的的值也是值也是15。 注意注意: 一个一个(y
55、 )表达式应该有一个表达式应该有一个(y )值值 2.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 第71页/共88页第70页/共88页第七十页,共89页。71左值左值 (lvalue) : (lvalue) : 赋值运算符左侧的标识符赋值运算符左侧的标识符变量可以变量可以(ky)(ky)作为左值作为左值; ;而表达式就不能作为左值而表达式就不能作为左值( (如如a+b);a+b);赋值表达式可以赋值表达式可以(ky);(ky);常变量也不能作为左值,常变量也不能作为左值, 右值右值 (lvalue) : (lvalue) :出现在赋值运算符右侧出现在赋值运算符右侧(yu c)(yu c)
56、的表达式的表达式 左值也可以出现在赋值运算符右侧左值也可以出现在赋值运算符右侧(yu c)(yu c),因而左值都,因而左值都可以作为右值。可以作为右值。2.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 第72页/共88页第71页/共88页第七十一页,共89页。72 赋值表达式中的“表达式”,又可以(ky)是一个赋值表达式。 例如: a=(b=5) 分析分析: :括弧内的括弧内的“b=5”“b=5”是一个赋值表达式,它的值等是一个赋值表达式,它的值等于于5 5。执行表达式。执行表达式“a=(b=5)”“a=(b=5)”相当于执行相当于执行“b=5”“b=5”和和“a“ab”b”两个赋值表达
57、式。两个赋值表达式。 赋值运算符按照赋值运算符按照“自右而左自右而左”的结合顺序,因此,的结合顺序,因此,“(b“(b5)”5)”外面的括弧可以外面的括弧可以(ky)(ky)不要,即不要,即“a=(b=5)”“a=(b=5)”和和“a=b=5”“a=b=5”等价。等价。2.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 第73页/共88页第72页/共88页第七十二页,共89页。73如:赋值表达式(a=3*5)=4*3分析分析: :先执行括弧内的运算,将先执行括弧内的运算,将1515赋给赋给a a,然后执行,然后执行4 4* *3 3的运算,得的运算,得1212,再把,再把1212赋给赋给a
58、a。最后。最后(zuhu)a(zuhu)a的值为的值为1212,整个表达式的值为整个表达式的值为1212。可以看到。可以看到(a=3(a=3* *5)5)出现在赋出现在赋值运算符的左侧,因此赋值表达式值运算符的左侧,因此赋值表达式(a=3(a=3* *5)5)是左值是左值 注意注意: :在对赋值表达式在对赋值表达式(a=3(a=3* *5)5)求解后,变量求解后,变量(binling)a(binling)a得到值得到值1515执行执行(a=3(a=3* *5)=45)=4* *3 3时,实际上是将时,实际上是将4 4* *3 3的积的积1212赋给变赋给变量量a a,而不是赋给,而不是赋给3
59、3* *5 5。不能写成:a=3*5=4*32.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 第74页/共88页第73页/共88页第七十三页,共89页。74赋值表达式也可以(ky)包含复合的赋值运算符。 如:a+=a-=a*a; a初值为12分析分析: :此赋值表达式的求解步骤此赋值表达式的求解步骤(bzhu)(bzhu)如下如下先进行先进行“* *”的运算,的运算, 它相当于它相当于* *,a a的的值为值为1212144144132132。再进行再进行“132”132”的运算,相当于的运算,相当于=a+(-132)=a+(-132),a a的值为的值为132-132132-132-26
60、4-264。2.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 第75页/共88页第74页/共88页第七十四页,共89页。75将赋值表达式作为表达式的一种,使赋值操作不仅可以将赋值表达式作为表达式的一种,使赋值操作不仅可以(ky)(ky)出现在赋值语句中,而且可以出现在赋值语句中,而且可以(ky)(ky)以表达式形式出以表达式形式出现在其他语句(如输出语句、循环语句等)中。现在其他语句(如输出语句、循环语句等)中。 如:如:printf(%dprintf(%d,a=b); a=b); 分析分析(fnx):(fnx):如果如果b b的值为的值为3 3, 则输出则输出a a的值的值( (也是表达式也是表达式a=ba=b的值的值)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论