第三章C语言运算符回顾变量和常量的含义熟悉基本数据类型-int、char、float和double使用算术运算符理解类型转换熟练使用scanf()和printf()函数课程目标算术运算符增量运算符逻辑运算符关系运算符按位运算符C的特殊运算符--“?”“&”和“*”,“,”运算符的优先级C语言运算符概述运算符:是用来表示各种运算的符号。表达式:用运算符将运算对象连接起来形成的运算式。C语言运算符:是一种向编译程序说明一个特定的数学或逻辑运算的符号。运算符必须有运算对象。C语言运算符的分类算术运算符关系运算符与逻辑运算符按位运算符算术运算符算术运算符的运算规则如下表所示:对象数名称运算符运算规则运算对象运算结果结合性单目正+取原值整型或实型整型或实型自右向左负-取负值双目加+加法自左向右减-减法乘*乘法除/除法模%整除取余数整型、字符型注意事项正、负运算是单目运算符,结合性是自右向左的。除法运算与运算对象的数据类型有关。若两个对象都是整型数据,则运算结果是整数(舍弃小数部分);若两个中有一个或两个都是实型,则运算结果为实型。但是若除数或被除数中有一个为负值,则舍入的方向是不固定的。模运算(%)要求两个运算对象必须均为整型数据。算术运算符优先级别单目算术运算符优于双目算术运算符“*,/,%”优于“+,-”;同级单目算术运算符的结合性满足右结合,同级双目算术运算符满足左结合。C语言算术表达式C语言算术表达式:由算术运算符和括号将运算对象连接起来的、符合C语法规则的式子称为表达式。运算对象包括常量、变量和函数等。[注意事项]:在表达式求值时,先按运算符的优先级别高低顺序执行。若在一个运算对象两侧的运算符的优先级别相同,则按规定的结合性处理。C语言中允许种类数值型数据之间进行混合运算,在进行混合运算时,不同类型的数据要先转换成同一类型,然后再进行运算。字符型常量、字符型变量可以在算术表达式中使用。增量运算符增量运算符1、自增运算符:++x=x+1可写成x++,或++xi++与++i的区别:x=i++表示将i的值赋给x后,i加1。x=++i表示i先加1后,再将新值赋给x。2、自减运算符:--x=x-1可写成x--,或--xi--与--i的区别:x=i--表示将i的值赋给x后,I减1。x=--i表示i先减1后,再将新值赋给x。自增自减运算符都是单目运算符,是对单目整型、字符型、指针型以及数组的下标等数据进行算术运算的,运算的结果仍是原数据类型。自增自减运算符的运算规则如下表所示:对象数名称运算符运算规则运算对象运算结果结合性单目前自增++先加1,后使用整型字符型指针型数组下标同运算对象的类型自右向左后自增++先使用,后加1前自减--先减1,后使用后自减--先使用,后减1[举例说明]:若i为3,则执行后:(1)++i/*运算式的值为4,i的值为4*/(2)i++/*运算式的值为3,i的值为4*/(3)--i/*运算式的值为2,i的值为2*/(4)i--/*运算式的值为3,i的值为2*/[注意事项]:1、自增自减运算符的运算对象只能是变量,不能用于常量或表达式。2、自增自减运算符既可以放在运算对象的前面(前缀),也可以放在运算对象的后面(后缀),两者功能上略有不同。3、在表达式中包含自增、自减运算时,要能正确分析,否则很容易出错。若i=5,请分析下面语句执行后j、i的值:j=i++;/*j的值为5,i的值为6*/j=++i;/*j的值为6,i的值为6*/赋值运算符用于将表达式的值赋给变量。是一个双目运算符,运算符的左边必须是变量,右边是表达式,赋值运算符(用=表示),用于将表达式的值赋给变量,结合性是自右向左的。例如:inti=5;是将常量值5赋给变量i.赋值运算符=右侧可以是变量或表达式.例如:inti=5,j=i;将变量i的值赋给变量j.赋值语句中的数据类型转换在赋值语句中,类型转换规则是:等号右边的值转换为等号左边变量所属的类型。做除法运算时应特别注意,例如:inti=15;floatf=i/2;运行后,f=7而并不等于准确值7.5正确的做法应该是:inti=15;floatf=i/2.0;也可直接将i定义为浮点数。逻辑运算符和表达式逻辑运算符种类:!(逻辑非)&&(逻辑与)||(逻辑或)逻辑运算真值表:C语言中,运算量:0表示“假”,非0表示“真”,运算结果:0表示“假”,1表示“真”,优先级:!&&||高低结合方向:!:从右向左&&:从左向右||:从左向右例a=x&&x=b//(a=x)&&(x=b)ab&&xy//(ab)&&(xy)a==b||x==y//(a==b)||(x==y)!a||ab//(!a)||(ab)初学者如果不熟悉逻辑运算符时,就可以写成上面的注释中带括号的形式,这样就很容易区分和理解其中的各个表达式。关系运算符关系运算符是比较两个操作数大小的符号C的关系运算符作用对照表:操作符作用大于=大于等于小于=小于等于==等于!=不等于按位运算符C和其它高级语言不同的是它支持按位运算符。C中按位运算符的作用:操作符作用&位逻辑与|位逻辑或^位逻辑异或~位逻辑反右移左移运算符说明按位运算是对字节或字中的实际位进行检测、设置或移位,它只适用于字符型和整数型变量以及它们的变体,对其它数据类型不适用。关系运算和逻辑运算表达式的结果只能是1或0。而按位运算的结果可以取0或1以外的值。移位运算符“”和“”是指将变量中的每一位向右或向左移动,其通常形式为:右移:变量名移位的位数左移:变量名移位的位数经过移位后,一端的位被“挤掉”,而另一端空出的位以0填补,所以,C中的移位不是循环移动的。移位的使用技巧可以代替乘法和除法运算,但速度远远快于乘法和除法。左移等效于乘法:左移1位,即箭头向左,右侧补0,等于乘21,左移两位等于乘22,左移三位等于乘23inti=4;intc=i1;//c=8右移等效于除法:右移1位,即箭头向右,左侧补0,等于除21,右移两位等于除22,右移三位等于除23inti=16;intc=i3;//c=16/23=2C的特殊运算符“?”运算符“?”运算符是一个三目运算符,其一般形式是:表达式1?表达式2:表达式3;“?”运算符的含义是:先求表达式1的值,如果为真,则求表达式2的值并把它作为整个表达式的值;如果表达式1的值为假,则求表达式3的值并把它作为整个表达式的值。intx,y;x=50;y=x70?100:0;//y将被赋值0。如果x=80,y将被赋值100。“?”运算符可以代替某些if-else形式的语句。例x?‘a’:‘b’//x=0,表达式值为‘b’;x‡0,表达式值为‘a’xy?1:1.5//xy,值为1.0;xy,值为1.5“&”和“*”运算符“&”和“*”运算符“&”运算符是一个返回操作数地址的单目操作符。“*”运算符是对“&”运算符的一个补充,它返回位于这个地址内的变量值,也是单目操作符。例如:inti,j,*m;i=10;m=&i;/*将变量i的地址赋给m*/j=*m;/*地址m所指的单元的值赋给j*/程序运行后,i=10,m为其对应的内存地址,j的值也为10。“,”运算符“,”运算符“,”运算符用于将多个表达式串在一起,“,”运算符的左边总不返回,右边表达式的值才是整个表达式的值。例如:intx,y;x=50;y=(x=x-5,x/5);经过上面的语句后,y值为9,因为x的初始值为50,减5后变为45,45除5为9赋给y。sizeof运算符sizeof运算符sizeof运算符是一个单目运算符,它返回变量或类型的字节长度。例如:sizeof(double)为8sizeof(int)为2也可以求已定义的变量,例如:floatf;inti;i=sizeof(f);则i的值将为4。C运算符的优先级C规定了运算符的优先次序即优先级。当一个表达式中有多个运算符参加运算时,将按下表所规定的优先级进行运算。表中优先级从上往下逐渐降低,同一行优先级相同。例如:表达式104&&!(10099)||3=5的值为1表达式104&&!(10099)&&3=5的值为0C运算符的优先级表达式优先级()(小括号)[](数组下标).(结构成员)最高-(指针型结构成员)!(逻辑非)~(位取反)-(负号)++(加1)--(减1)&(变量地址)*(指针所指内容)type(函数说明)sizeof(长度计算)*(乘)/(除)%(取模)+(加)-(减)(位左移)(位右移)(小于)=(小于等于)(大于)=(大于等于)==(等于)!=(不等于)&(位与)^(位异或)|(位或)&&(逻辑与)||(逻辑或)?:(?表达式)=+=-=(联合操作),(逗号运算符)最低本章总结算术运算符增量运算符逻辑运算符关系运算符按位运算符C的特殊运算符--“?”“&”和“*”,“,”运算符的优先级