c语⾔中双⽬运算符结合⽅向解释,C运算符的组合⽅向
C运算符的结合⽅向
转载说明:这篇⽂章是以前在⽹上看到的,它以很容易理解的⽅式解释了什么是运算符的优先级,当时觉得写的不错,因此看完之后保存了下来,今天拿出来与⼤家分享。由于已不知道它的作者和出处,因此⽆法标明了,请作者见谅。在标准C语⾔的⽂档⾥,对操作符的结合性并没有作出⾮常清楚的解释。⼀个满分的回答是:它是仲裁者,在⼏个操作符具有相同的优先级时决定先执⾏哪⼀个。每个操作符拥有某⼀级别的优先级,同时也拥有左结合性或右结合性。优先级决定⼀个不含括号的表达式中操作数之间的“紧密”程度。例如,在表达式a*b+c 中,乘法运算的优先级⾼于加法运算符的优先级,所以先执⾏乘法a*b,⽽不是加法b+c。但是,许多操作符的优先级都是相同的。这时,操作符的结合性就开始发挥作⽤了。在表达式中如果有⼏个优先级相同的操作符,结合性就起仲裁的作⽤,由它决定哪个操作符先执⾏。像下⾯这个表达式:int a, b=1, c=2;
a=b=c;我们发现,这个表达式只有赋值符,这样优先级就⽆法帮助我们决定哪个操作先执⾏,是先执⾏b=c呢,还是先执⾏a=b?如果按前者,a的结果为2,如果按后者,a的结果为1。所有的赋值符(包括复合赋值)都具有右结合性,就是说在表达式中最右边的操作最先执⾏,然后从右到左依次执⾏。这样,c先赋值给b,然后b再赋值给a,最终a的值是2。类似地,具有左结合性的操作符(如位操作符“&”和“|”)则
是从左⾄右依次执⾏。所以,遇到⼀个表达式时,先根据运算符的优先级将表达式拆分成⼏个⼦表达式,然后在每个⼦表达式中根据运算符的结合性来进⼀步确定执⾏的顺序。【特殊情况】看下⾯这个C表达式:a+++b;结果是(a++)+b还是a+(++b)呢?答案是前者,因为在遇到这种情况时,C编译器会将表达式按照从左往右的顺序尽量匹配出⼀个⼦表达式,所以当C编译器遇到a且后⾯有3个+号时,会⾸先尝试匹配a+++,当然这是没有意义的,所以接着尝试a++发现这是有意义的匹配,因此确定a++为第⼀个⼦表达式,然后再接着匹配+号和b。因此结果是(a++)+b。
这种情况不能算是上⾯所讨论的运算符优先级和结合性的特例,因为它发⽣在优先级和结合性判断之前,但确实具有⼀些迷惑性,所以建议在遇到这种情况时给其加上括号,以增加可读性且避免可能发⽣的不必要的错误。
C语⾔中的运算符及其优先级
优先级
运算符
名称或含义
使⽤形式
结合⽅向
说明
1
[]
数组下标
数组名[常量表达式]
c语言中逗号表达式的用法左到右
()
圆括号
(表达式)/函数名(形参表)
.
成员选择(对象)
对象.成员名
对象指针->成员名
2
-
负号运算符
-表达式
右到左
单⽬运算符
(类型)
强制类型转换
(数据类型)表达式
++
⾃增运算符
++变量名/变量名++单⽬运算符
--
⾃减运算符
--变量名/变量名--
单⽬运算符
*
取值运算符
*指针变量
单⽬运算符
&
取地址运算符
&变量名
单⽬运算符
!
逻辑⾮运算符
!表达式
单⽬运算符
~
按位取反运算符
3
/
除
表达式/表达式
左到右
双⽬运算符
*
乘
表达式*表达式
双⽬运算符
%
余数(取模)
整型表达式/整型表达式双⽬运算符
4
+
加
表达式+表达式
左到右
双⽬运算符
-
减
表达式-表达式
双⽬运算符
5
<<
左移
变量<
左到右
6
>
⼤于
表达式>表达式左到右
双⽬运算符
>=
⼤于等于
表达式>=表达式双⽬运算符
<
⼩于
表达式
双⽬运算符
<=
⼩于等于
表达式<=表达式双⽬运算符
7
==
等于
表达式==表达式左到右
双⽬运算符
!=
不等于
表达式!= 表达式双⽬运算符
8
表达式&表达式
左到右
双⽬运算符
9
^
按位异或
表达式^表达式
左到右
双⽬运算符
10
|
按位或
表达式|表达式
左到右
双⽬运算符
11
&&
逻辑与
表达式&&表达式
左到右
双⽬运算符
12
||
逻辑或
表达式||表达式
左到右
双⽬运算符
13
:
条件运算符
表达式1? 表达式2: 表达式3右到左
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论