您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 第03讲 运算符以及数据类型
第三讲运算符以及数据类型2.6运算符及表达式2.7数据类型转换2.8类型定义2.6运算符及表达式C语言运算符可以分为:算术运算符、逻辑运算符、关系运算符、位运算符、赋值运算符。2.6.1算术运算符和算术表达式1.算术运算符:加、减、乘、除及取模即:+,-,*,/,%来表示。C语言规定:(1)模运算符%,仅用于整型变量或整型常量。(2)优先级:一个表达式中如有多个运算符,则计算先后次序为相应运算符的优先级高的优先。乘、除、模优先级高于加、减的优先级。(3)结合方向:是一个运算对象两侧的运算符的优先级别相同时,应遵循的处理规则。算术运算符的结合方向是从左至右;赋值运算符的结合方向是从右至左。2.算术表达式:由算术运算符、括号以及操作对象组成的符号C语言语法规则的表达式称为算术表达式。2.6.2赋值语句1.赋值运算符语言的赋值运算符是“=”,它的作用是赋值运算符右边表达式的值赋给其左边的变量。例如:a=10,x=a+5,前者是把常量10赋给变量a,后者是将表达式a+5的值赋给变量x.注意:如果“=”两侧的类型不一致,在赋值时要进行类型转换。例如a=b,执行该语句时,b的结果转换为a的类型后才能进行赋值运算。2.复合赋值运算符C语言允许在赋值运算符“=“之前加上其它运算符,以构成其复合运算符。复合运算符多数为双目。复合运算符有:+=,-=,*=,/=,%=,=,=,&=,^=,|=例:a+=2等价于a=a+2x*=y+5等价于x=x*(y+5)x%=8等价于x=x%8赋值运算符都是自右向左执行。3.赋值语句与赋值表达式赋值语句最简单的形式是:变量=表达式;功能:是赋值运算符右边的“表达式”的值赋给左边的变量。赋值表达式也可以包含复合的赋值运算符,例:如果a=10,表达式a+=a-=a*a的值为-180。其步骤为:(1)先进行a-=a*a的计算,它相当于a=a-a*a=10-10*10=-90.(2)再进行a+=-90的计算,它相当于a=a+(-90)=-90-90=-180.4.自增自减运算符i++(或i--)表示在使用该表达式值之后将i值加1(或减1)。++i(或--i)表示在使用该表达式值之前将i值加1(或减1)。说明:(1)++和--仅适用于变量,不能用于常量或表达式。(2)++和--运算符的结合方向是“至右向左”。Main(){inta=100;printf(“a++=%d\n”,a++);printf(“++a=%d\n”,++a);printf(“a--=%d\n”,a--);printf(“--a=%d\n”,--a);}输出结果:a++=100++a=102a--=102--a=1002.6.3关系运算符和关系表达式1.关系运算符关系运算符均为两目运算符。共有六种:大于小于=大于等于=小于等于==等于!=不等于关系运算符要求两个操作数是同一种数据类型,其结果为一逻辑值,即关系成立时,其值为真(true),用非0值表示;关系不成立时,其值为假(false),用0表示。关系运算符的优先级借低于算术运算符,关系运算符==和!=低于前四种运算符,并且结合方向均为自左至右。2.关系表达式由关系运算符将两个表达式连接起来的有意义的式子称为关系表达式。如:a+bc-6先进行a+b和c-6两个算术表达式的运算,得到两个值后再进行比较,从现而求出关系表达式的值。其值为0或非0。关系表达式的值是一个逻辑值,即“真”或“假”。用1表示“真”,用0表示“假”。如:a=4,b=1,C=ab;c的值为1,若a=1,b=8,x=ab;x的值为0。2.6.4逻辑运算符和逻辑表达式1.逻辑运算符逻辑运算符有“&&“(逻辑与)、”||“(逻辑或)和”!“(逻辑非)三种。逻辑运算符的操作对象为零或非零整数值,见表2.4.表2.4逻辑运算规则数据a数据ba&&ba||b!a!bTTTTFFTFFTFTFTFTTFFFFFTT2.逻辑表达式由逻辑运算符和其操作对象组成表达式称为逻辑表达式。2.6.5位运算符位(bit)运算是C语言的一大特色,可直接对构成内存的基本单位“字节”(byte)进行按位操作。按位与(&)操作规则:参加运算的两个运算量,如果两个相应的位均为1,则该位的结果为1,否则为0,见表2.5表2.5接位与运算量10101运算量20011结果0001例如:(1)清零。(2)取一个数中的某些位。高位清零:0010110110011100&00000000111111110000000010011100低位清零:0010110110011100&111111110000000000101101000000002.按位或(|)操作规则:参加运算的两个运算量,其相应的位中只有一个为1,则该位的结果为1,否则为0。表2.6按位或运算量10101运算量20011结果0111例如:(1)01000001|0010100101101001(2)01000001|0000000001000001(3)01000011|1111111111111111(4)01000001|1011111011111111例如:将某一个数的某些位置为1。一个整数a,要将其低字节全置为1,即低字节为11111111,可将该数与255(十六进制为FF,二进制为11111111)按按位或即可。3.按位异或(^)操作规则:参加运算的两个运算量,当相应位相同时,其结果在该位为0,相应位不同时,其结果在该位为1,即按位相加,但不进位。表2.7按位异或运算量10101运算量20011结果0110(1)使指定位翻转。即由1变为0,由0变为1。例:01100110^0000111101101001(2)不使用临时变量,交换两个值。方法为:若有两个数a和b,通过下面的赋值语言可将a和b的值互换:a=a^b;b=b^a;b=a^b;4.按位求反(~)操作规则:运算符~是一个单目运算符,用来对一个数二进制表示按位求反,即瘵0变成1,将1变成0。表2.8按位求反运算量01结果10例:~0110100110010110将一个数的某些位变为0。方法是:瘵该数a与~b按位求与,此处的b为这样的一个数,即要求a中变为0的那些位均为1,其余位均为0。如要将a的最低位变为0,则可使用下述表达式实现。A=a&~15.左移()操作规则:将一个数的各二进制位全部左移若干位,左移后,右边的这些位用0填补,左边移出的位舍弃不用。例:a=a2;若a=15,即二进制00001111,左移两位后变为00111100。若再向左移4位,则变为11000000。将一个数左移1位,相当于该数乘以2,左移2位相当于该数乘以4。如上例中a=15,则a=a2,此时a=15*4=60。但是这种情况仅指左移时没有1被移出去的情况,左移运算要比乘法运算快得多。6.右移()操作规则:将一个数的各二进制位全部右移若干位,右移后,右边移出的位被舍弃,而左边的填补分两种情况:(1)该数为无符号数,则高位补0。例:a=a2;右a=15,二进制为00001111,右移两位后为00000011。(2)该数为有符号数,若原来的符号位为0(最高位为0,即正数)则高位补0,若原来的符号位为1(即表示该数为负数),高位补0或1,取决于所使用的计算机系统。有的系统补0,称为逻辑右移,有的系统补1,称为算术右移。例:a:1000110110000111a1:0100011011000011(逻辑右移)a1:1100011011000011(算术右移)2.6.6其他运算符1.逗号运算符逗号运算符为“,“。逗号表达式是用逗号运算符把两个表达式组合成的一个表达式。其一般形式为〈表达式1〉,〈表达式2〉说明:(1)逗号表达式的执行过程是:先求表达式1的值,再求表达式2的值,表达式2的值就是整个逗号表达式的值。(2)一个逗号表达式可以与另一个表达式构成一个新逗号表达式。(3)逗号运算符是所有运算符中级别最低的。(4)逗号表达式常用于for语句中,它可以表达多个初值或多个步长增量。逗号表达式的一般形式可以扩展为〈表达式1〉,〈表达式2〉,〈表达式3〉,……〈表达式N〉表达式n的值是整个表达式的值。2.条件运算符条件运算符是一个三目运算符,把三表达式组合成一个表达式。其一般形式为〈表达式1〉?〈表达式2〉:〈表达式3〉;功能:计算〈表达式1〉的值,如果该值为真(非0值),则计算〈表达式2〉的值,并且该值即为条件表达式值。若〈表达式1〉的值为假(0),则计算〈表达式3〉的值,并将该值作为条件表达式的值。说明:(1)条件运算符优先级别高于赋值运算符,低于关系运算符和算术运算符。(2)条件运算符结合方向是“自右至左”。(3)〈表达式1〉与〈表达式2〉、〈表达式3〉类型可以不同。3.Sizeof运算符sizeof运算符是测试变量、表达式或类型名所占用的字节数。有两种用法。sizeof〈表达式〉:测试表达式所占用的字节数。sizeof〈表达式〉:测试类型名所占用的字节数。例如:sizeof(float)其值为4。sizeof运算符可以出现的表达式中。main(){inta=4;floadb=5.6;printf(“%d,%d\n”,sizeof(a),sizeof(b));}输出结果:2,42.7数据类型转换在内存中,字符是以系统中所使用字符的编码值形式存储的,C语言允许字符型数据和整型数据之间通用一个字符型数据,即可以以字符形式输出,也可以以整型形式输出,同时,字符型数据可能赋给整型变量,整型数据也可以赋给字符型变量,只是当整型变量数据的大小超过字符型变量的表示范围时,需要截取相应的有效位。除字符型数据和整型数据之间可以通用之外,不同类型的数据在进行混合运算时,往往需要进行强制类型转换。因此类型转换有两种方式:一种是自动类型转换;另一种是强制类型转换。2.7.1自动类型转换在进行计算时,首先将不同类型的数据转换成同一类型,然后进行计算不同类型数值转换规则:DoublefloatLongUnsignedIntchar,short2.7.2强制类型转化强制类型转化的一般形式如下所示:(强制的类型名)〈变量〉例如:(int)(a+b),将a+b的结果强制转换成int型;(float)a/b,将a的结果强制转换成float型后,再进行计算。注意:经强制类型转换后,得到的是一个所需类型的中间变量,原来变量的类型并没有发生任何变化。2.8类型定义C语言允许使用typedef语句定义新类型名,以取代已有类型名,如:typedefintcounter;作用是定义counter等价于基本数据类型名int,以后就可以利用counter来定义int型变量了。如:counterI,n;等价于intI,n;类型定义的优点是:能够提高程序可读性。注意:(1)typedef语句不能创造新的类型,只能为已有的类型增加一个类型名。(2)typedef语句只能用来定义类型名,而不能用来定义变量。例如:分析下例程序。#include“stdio.h”typerefintinteger;typedeffloatreal;Main(){integeri=5;realf;f=real(i)/10;printf(%f”,f);}
本文标题:第03讲 运算符以及数据类型
链接地址:https://www.777doc.com/doc-3394485 .html