现在的位置: 首页 > 综合 > 正文

运算符的优先级和结合性

2016年08月25日 ⁄ 综合 ⁄ 共 2629字 ⁄ 字号 评论关闭

有些不常用的运算符优先级总是忘,看见一篇总结的比较好的运算符的结合型及优先级相关的文章,转之

:http://blog.chinaunix.net/uid-676763-id-2685467.html


一般情况下,单目运算符级别较高,赋值运算符级别较低

算术运算符较高,关系和逻辑运算符优先级较低

结合性分为左结合和右结合两种

表达式:由运算符连接常量、变量、函数所组成的式子,每个表达式都有一个值和类型,表达式值按运算符优先级和结合性所规定顺序进行

运算符有优先级,而且有特点,就是他的结合性

运算量参与运算的先后顺序不仅要遵守运算符优先级的规定,还要受运算符结合性的制约,以便决定是由左向右运算还是由右向左运算。

运算符分类:

1、   算术运算符:+ - * /
求余(%,也称模运算) ++ --

2、   关系运算符:> < == >= <= !=

3、   逻辑运算符:&& || !

4、   位运算符:位与 &
位或 | 位非 !
位异或 ^ 左移 <<
右移 >>

5、   赋值运算符:简单运算符=,复合算术运算符:+= -= *= /=,复合位运算符:&=  |=  ^=  >>= <<=

6、   条件运算符:这是一个三目运算符,用于条件求值 ? :,相当于if……elsetest?A:B,test0A0B

7、   逗号运算符:,用于把若干表达式组合成一个表达式

8、   指针运算符:取内容(*),取地址(&)

9、   求字节运算符:sizeof

10、特殊运算符:() []
成员-> .

优先级:运算符优先级共15级,1级最高,15级最低

优先级高的先运算,低的后运算,如果运算量两端的运算符优先级相同,则按运算符的结合性所规定的方向处理

结合性:分为两种即左结合性(自左向右)和右结合性(自右向左)

例如:算术运算符结合性为左结合性

赋值运算符为右结合性,如x=y=z,先执行y=z,然后执行x=(y=z)

算术运算符

+ 加法运算符:为双目运算符,具有左结合性

- 减法运算符:为双目运算符,具有左结合性,如果为负值运算符,则为单目,左结合性

* 乘法运算符:为双目运算符,左结合性

/ 除法运算符:为双目运算符,左结合性,运算中都为整数,结果由舍去小数,结果为整数,如果运算中有实型量,则结果为双精度型,即使结果值(指等号右边)为整型/float/double
,也符合上述原则

% 求余运算符:双目运算符,左结合,要求参与运算的量均为整数,结果为二数相除后的结果

++ --运算符:自增/自减,单目运算符,右结合性,例:++dd++,运算的结果不是同的,由于其为右结合,所以第一个首先进行自增运算,如果用printf输出,结果为d1,而后都是先输出结果,然后自增1,还要注意的一点是:printf函数的计算是从右到左进行计算

赋值运算符和赋值表达式

格式:变量=表达式;

赋值运算符为右结合性,x=y=z=5x=(y=(z=5)))是相同的。

=C中为运算符,而且组成赋值表达式,凡是表达式出现的地方均可出现赋值表达式,C中规定只要加上分号;即表示形成了语句

在赋值过程中,如果赋值语句两边的数据类型不同,系统将自动进行类型转换,即把赋值符右边的类型转为赋值符左边的类型,规定如下:

1、   实型赋与整型,舍去小数,不进行四舍五入

2、   整型赋与实型,数值不变,但以浮点数形式存放,即增加了小数位数

3、   字符型赋整型,字符型为1个字节,整型为2个字节,所以将字符型的ASCII码放到整型的低8位,高8位以0补齐

4、   整型赋与字符型,字符型为1个字节,整型为2个字节,仅有低8位有效

复合赋值符及表达式

=左边加上其他的双目运算符即可构成复合赋值符

+= -= *= /= <<= >>=&= |= %=

逗号运算符

把两个表达式连接起来,组成一个表达式,称为逗号表达式

格式:表达式1,表达式2,求值过程分别求两个表达式的值,并以表达式2的值做为整个逗号表达式的值

y=(x=a+b),(b+c),实际结果为x=a+by=a+b,原因是因为逗号表达式的优先级是最低的,如果求逗号表达式的值,应该在外层加上括号,即y=((x=a+b),(b+c)),结果为x=a+by=b+c

逗号表达式的特点:

1、   可以嵌套,即表达式1、表达式2都可以是另一个逗号表达式

2、   程序中使用逗号表达式值,通过是要分别求逗号表达式内各表达式的值,并不一定需要整个逗号表达式的值

3、   并非所有出现逗号的地方都组成逗号表达式,如变量说明就非逗号表达式

关系运算符< > == >= <= !=

是双目运算符,左结合,关系运算符优先级低于算术运算符,但高于赋值运算符,其中 < > >= <=优先级相同,==!=优先级相同,但低于前者

格式:表达式1 关系运算符表达式2,关系表达式允许嵌套,其值为01,例如:k==j==i+5,设k=5j=4i=3,计算顺序为:先计算i+5=8,然后比较k==j,返回值为0,然后比较0==i+5,即0==8,最后返回为0

逻辑运算符:有三种 && || !

前两者为双目运算符,后者为单目运算符

前两者为左结合,后者为右结合

== != > < >= <= 优先级高于&&
||,低于!,算术运算符高于 > < >= <= == !=,但低于!

单目运算符高于多目运算符

逻辑运算符的值:

1&
都为真(1),为真(1

2|
有一个为真(1),为真(1

3!
参与量为真(1),返回假(0),参与量为假(0),返回真(1

逻辑表达式的格式:表达式1 逻辑表达式表达式2,允许嵌套。

优先级排列表格:

优先级

运算符

名称

运算对象个数

结合性

1

()

圆括号

 

[]

下标运算符

 

->

指向成员运算符

 

.

结构体、共用体成员运算符

 

2

!

逻辑非

逻辑运算符

单目运算符

~

按位取反

位运算符

++

自增1

算术运算符

--

自减1

-

负号

类型

强制类型转换

*

指针运算符

&

取地址运算符

sizeof

求存储长度运算符

3

*

乘运算符

算术运算符

双目运算符

/

除运算符

%

余运算符

4

+

加运算符

算术运算符

双目运算符

-

减运算符

5

<<

左移运算符

位运算符

双目运算符

>>

右移运算符

6

>

大于运算符

关系运算符

双目运算符

<

小于运算符

>=

大于等于运算符

<=

小于等于运算符

7

==

等于运算符

双目运算符

!=

不等于运算符

8

&

按位与运算符

位运算符

双目运算符

9

^

按位异或运算符

双目运算符

10

|

按位或运算符

双目运算符

11

&&

与运算符

逻辑运算符

双目运算符

12

||

或运算符

双目运算符

13

? :

条件运算符

三目运算符

14

=

赋值运算符

双目运算符

+=

-+

*=

/=

%=

>>=

<<=

&=

^=

|=

15

,

逗号运算符

 

抱歉!评论已关闭.