c语⾔运算符优先级,结合性(左右结合详解)重新翻了遍,觉得对c语⾔运算符结合性有必要提⼀下,毕竟去年我⾃⼰刚学c语⾔的时候,就没搞明⽩结合性的问题。
什么是左结合?什么是右结合?它们是⼲嘛⽤的?它们是什么时候⽤的?
本⽂将围绕这⼏个问题展开..
(⼩⽩⽂,⼤神绕道)
运算符优先级按从高到低排列先附录⼏个⾃⼰学习过程中的参考⽹站。(有些见解和例⼦来⾃⼀下⽹站)
在讲结合性之前,先提⼀下c语⾔的运算符及其优先级关系。
C语⾔运算符优先级
优先级运算符名称或含义使⽤形式结合⽅向说明
1[]数组下标数组名[常量表达式]
左到右
-
-()圆括号(表达式)/函数名(形参表)--.成员选择(对象)对象.成员名--->成员选择(指针)对象指针->成员名--
2-负号-表达式
右到左
单⽬运算符~按位取反运算符~表达式
++⾃增运算符++变量名/变量名++
--⾃减运算符--变量名/变量名--
*取值运算符*指针变量
&取地址运算符&变量名
!逻辑⾮运算符!表达式
(类型)强制类型转换(数据类型)表达式--
sizeof长度运算符sizeof(表达式)--
3/除表达式/表达式
左到右双⽬运算符*乘表达式*表达式
%余数(取模)整型表达式%整型表达式
4+加表达式+表达式
左到右双⽬运算符-减表达式-表达式
5<< 左移变量<<;表达式
左到右双⽬运算符>> 右移变量>>表达式
6> ⼤于表达式>表达式
左到右双⽬运算符>=⼤于等于表达式>=表达式
< ⼩于表达式<;表达式
<=⼩于等于表达式<=表达式
7==等于表达式==表达式
左到右双⽬运算符!=不等于表达式!= 表达式
8&按位与表达式&表达式左到右双⽬运算符9^按位异或表达式^表达式左到右双⽬运算符10|按位或表达式|表达式左到右双⽬运算符11&&逻辑与表达式&&表达式左到右双⽬运算符12||逻辑或表达式||表达式左到右双⽬运算符
13?:条件运算符表达式1?
表达式2: 表达式3
右到左三⽬运算符
14=赋值运算符变量=表达式
右到左
--/=除后赋值变量/=表达式--*=乘后赋值变量*=表达式--%=取模后赋值变量%=表达式--+=加后赋值变量+=表达式---=减后赋值变量-=表达式--<<=左移后赋值变量<<=表达式-->>=右移后赋值变量>>=表达式--&=按位与后赋值变量&=表达式--^=按位异或后赋值变量^=表达式--|=按位或后赋值变量|=表达式--
15,逗号运算符表达式,表达式,…左到右--
说明:
运算符共分为15级,1级优先级最⾼,15级优先级最低。
同⼀优先级的运算符,运算次序由结合⽅向所决定。(结合性:2 13 14 是从右⾄左 其他都是 从左⾄右)    简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
再详细⼀点,附带⼀个⼝诀。(⽹上的)
括号成员第⼀;                //括号运算符[]() 成员运算符. ->
全体单⽬第⼆;              //所有的单⽬运算符⽐如++、 --、 +(正)、 -(负) 、指针运算*、&
乘除余三,加减四;        //这个"余"是指取余运算即%
移位五,关系六;          //移位运算符:<< >> ,关系:> < >= <= 等
等于(与)不等排第七;      //即== 和!=
位与异或和位或;  "三分天下"⼋九⼗;    //这⼏个都是位运算: 位与(&)异或(^)位或(|)
逻辑或跟与;              //逻辑运算符:|| 和 &&
⼗⼆和⼗⼀;          //注意顺序:优先级(||) 底于 优先级(&&)
条件⾼于赋值,                //三⽬运算符优先级排到13 位只⽐赋值运算符和","⾼
逗号运算级最低!        //逗号运算符优先级最低
如果想详细了解运算符优先级的关系,我想上⾯的表格和⼝诀⾜以了。
有了以上的基础,我们回归本篇⽂章的主题---结合性。
观察上述运算符表格我们不难发现,在优先级相同的列表中,有的不⽌存在⼀种运算符,那当这两种运算符碰到⼀起了,该怎么计算呢?
⼜或者,两个相同的运算符在⼀起,该怎么进⾏运算呢?
要解决这些问题,就必须了解结合性了。
C 语⾔与其他⾼级语⾔相⽐, ⼀个显著的特点就是其运算符特别丰富, 共有34 种运算符。C 语⾔将这34 种运算符规定了不同的优先级别和结合性。优先级是⽤来标识运算符在表达式中的运算顺序的, 在求解
表达式的值的时候, 总是先按运算符的优先次序由⾼到低进⾏操作, 可是, 当⼀个运算对象两侧的运算符优先级别相同时, 则按运算符的结合性来确定表达式的运算顺序。  运算符的结合性指同⼀优先级的运算符在表达式中操作的组织⽅向, 即: 当⼀个运算对象两侧运算符的优先级别相同时, 运算对象与运算符的结合顺序, C 语⾔规定了各种运算符的结合⽅向( 结合性) 。
⼤多数运算符结合⽅向是“⾃左⾄右”, 即: 先左后右, 例如a- b+c, b 两侧有- 和+两种运算符的优先级相同, 按先左后右结合⽅向, b 先与减号结合, 执⾏a- b 的运算, 再执⾏加c 的运算。
除了⾃左⾄右的结合性外, C 语⾔有三类运算符参与运算的结合⽅向是从右⾄左。即: 单⽬运算符, 条件运算符, 以及赋值运算符。
关于结合性的概念在其他⾼级语⾔中是没有的, 这是C语⾔的特点之⼀,特别是从右⾄左结合性容易出错, 下⾯通过⼏个具体的运算符来剖析
C 语⾔运算符的结合性。  若a 是⼀个变量, 则++a 或a++和- - a 或a- - 分别称为前置加或后置加运算和前置减或后置减运算, 且++a 或
a++等价于a=a+1, - - a 或a- - 等价于a=a- 1, 即都是使该变量的值增加1 或减少1。由此可知, 对⼀个变量实⾏前置或后置运算, 其运算结构是相同的, 但当它们与其他运算结合在⼀个表达式中时, 其运算值就不同了。
前置运算是变量的值先加1 或减1, 然后将改变后的变量值参与其他运算, 如x=5; y=8; c=++x*y; 运算后, c 的值是48,x 的值是6,y 的值是8。
⽽后置运算是变量的值先参与有关运算, 然后将变量本⾝的值加1 减1, 即参加运算的是该变量变化前的值。如x=5; y=8; c=x++*y;运算后, c 的值是40,x 的值是6, y 的值是8。
值得注意的是, 前置、后置运算只能⽤于变量, 不能⽤于常量和表达式, 且结合⽅向是从右⾄左。如当i=6 时, 求- i++的值和i 的值。由
于“- ”(负号) “++”为同⼀个优先级, 故应理解为- (i++), ⼜因是后置加, 所以先有- i++的值为- 6, 然后i 增值1 为7, 即i=7。
讲到这⾥,⼤家应该都明⽩了吧。说⽩了,许多操作符的优先级都是相同的。这时,操作符的结合性就开始发挥作⽤了。在表达式中如果有⼏个优先级相同的操作符,结合性就起仲裁的作⽤,由它决定哪个操作符先执⾏。先执⾏,可以看做是加上括号。⽐如,右结合(从右到左),那就是,把右边的运算⽤括号先括起来,再与左边的进⾏计算,这样⾃然是先执⾏右边的了。  ⽐如  int a,b=1,c=2;        a=b=c;  这⾥'='的结合性是从右到左。 故a=b=c; 可变为a=(b=c);  即a=2。
差不多就讲这些了。
总的来说,掌握上述优先级,结合性是有⼀定⽤处的,但也不是必须的。 毕竟,咱们有()这个⼤招不是,哪⾥不确定,哪⾥补()就是了。
学习的路上,与君共勉。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。