C语言运算符( 二 )


C语言运算符

文章插图
所有的优先权中,只有三个优先权是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符 。其它的都是从左至右结合 。具有最高优先权的其实并不算是真正的运算符,它们算是一类特殊的操作 。()是与函式相关,[]与数组相关,而->及.是取结构成员 。其次是单目运算符,所有的单目运算符具有相同的优先权,因此在我认为的 真正的运算符中它们具有最高的优先权,又由于它们都是从右至左结合的,因此*p++与*(p++)等效是毫无疑问的 。另外在C语言里,没有前置后置之分,因为++ -- 是右结合所以右侧优先运算,表现为 "运算元后置优先权比较高" 的假象,前置和后置的区分是因为运算符重载而后加入C++的接下来是算术运算符,*、/、%的优先权当然比+、-高了 。移位运算符紧随其后 。其次的关係运算符中,< <= > >=要比 == !=高一个级别,不大好理解 。所有的逻辑操作符都具有不同的优先权(单目运算符除外,!和~)逻辑位操作符的"与"比"或"高,而"异或"则在它们之间 。跟在其后的&&比||高 。接下来的是条件运算符,赋值运算符及逗号运算符 。在C语言中,只有4个运算符规定了运算方向,它们是&&、| |、条件运算符及赋值运算符 。&&、| |都是先计算左边表达式的值,当左边表达式的值能确定整个表达式的值时,就不再计算右边表达式的值 。如 a = 0 && b; &&运算符的左边位0,则右边表达式b就不再判断 。在条件运算符中 。如a?b:c;先判断a的值,再根据a的值对b或c之中的一个进行求值 。赋值表达式则规定先对右边的表达式求值,因此使 a = b = c = 6;成为可能 。口诀注释优先权等级口诀圆方括弧、箭头一句号, 自增自减非反负、针强地址长度,乘除,加减,再移位,小等大等、等等不等,八位与,七位异,六位或,五与,四或,三疑,二赋,一真逗 。其中“,”号为一个等级分段 。优先权等级注释“圆方括弧、箭头一句号”指的是第1级的运算符 。其中圆方括弧很明显“()、[]”,箭头 指的是指向结构体成员运算符“->”,句号 指的是结构体成员运算符“.” ;“自增自减非反负、针强地址长度”指的是第2级的运算符 。其中 非 指的是逻辑运算符“!”,反 指的是按位取反运算符“~”,负 指的是负号运算符“-”,针 指的是指针运算符“*”,强 指的是强制类型转换运算符,地址 指的是地址运算符“&”,长度 指的是长度运算符“sizeof ”;“乘除,加减,再移位”移位指的是左移运算符“<<”和右移运算符“>>”,其中除法还包括了 取余运算符“%”; “小等大等、等等不等” 指的是第6级到第7级的运算符:<、<=、>和>=,等等指的是等于运算符==,不等指的是不等于运算符!=“八位与,七位异,六位或”其中 八位与 指的是第8级的 按位与 运算符“&”,七位异 指的是第9级的按位异或运算符“^”,六位或 指的是第10级的按位或运算符“|”;“五与,四或”指的是第11级、第12级的逻辑与运算符“&&”和逻辑或运算符“||”;“三疑,二赋,一真逗”指的是第13级到第15级的运算符 。其中,三疑指的是条件运算符“?:” (三有双重含义:即指优先权别是三,它的运算符类型也是三目,疑也取“?”之意),二赋 指的是赋值运算符=、+=、-=、*=、/=、%=、>>=、<<=、&=、^=和|= ,一真逗 指的是第15级的“,”运算符,真字只是为了语句需要罢了 。由于C语言的运算符优先权与C++的不完全一样(主要是增加了几个运算符),所以这个口诀不能完全实用于C++.但是应该能够兼容,大家可以比较一下他们的区别应该就能够很快掌握C++的优先权的!套用举例1、赋值运算符:a=5;a=b=0;第一个赋值语句把5赋给变数a;第二个赋值语句的意思是把0同时赋值给两个变数 。这是因为赋值语句是从右向左运算的,也就是说从右端开始计算,先b=0,然后a=b 。2、複合赋值运算符:a=1;a+=3;上面第二个赋值语句等价于a=a+3;即a=4 。3、算术运算符:Area=Height*Width;num=num1+num2/num3-num4;第一个赋值语句Height和Width相乘结果赋给变数Area;第二个赋值语句先完成num2与num3的整除运算,然后与num1相加,再减去num4,结果赋给num 。运算符运算顺序先算乘除再算加减 。单目正和单目负最先运算 。4、逻辑运算符:a=1,b=1;a||b-1;因为a=1为真值,所以不管b-1是不是真值,总的表达式一定为真值,这时后面的表达式就不会再计算了 。5、关係运算符:if(a>0)...如果a>0,则执行if语句中的内容,否则退出 。6、条件运算符:a=(b>0)?b:-b;当b>0时,a=b;当b不大于0时,a=-b;其实上面的意思就是把b的绝对值赋值给a 。7、逗号运算符:b=2,c=7,d=5;a=(++b,c--,d+3);有三个表达式,用逗号分开,所以最终的值应该是最后一个表达式的值,也就是d+3=8,所以a=8 。8、位逻辑运算符包括:1 。&位与符 2 。|位或符 3 。^位异或符 4 。~位取反符以运算元12为例 。位运算符将数字12视为1100 。位运算符将运算元视为位而不是数值 。数值可以是任意进制的:十进制、八进制或十六进制 。位运算符则将运算元转化为二进制,并相应地返回1或0 。位运算符将数字视为二进制值,并按位进行相应运算,运算完成后再重新转换为数字 。例如:表达式10&15表示(1010 & 1111),它将返回表示1010的值10 。因为真真得真,或者是11得1,同位全是1结果也是1表达式10|15表示(1010 | 1111),它将返回表示1111的值15 。假假得假 。全零得零 。表达式10^15表示(1010 ^ 1111), 它将返回表示0101的值5 。此时是同性相斥,相同的就为假 。表达式~10表示(~1010),它将返回表示0101的值 5 。此号好理解,按位取反 。