C语言中函数参数处理顺序 c语言函数的参数分为哪两种( 二 )


位与运算符 10级
“”按位与运算符
位异或运算符 11级
“ ∧ ”按位异或运算符(Bitwise exclusive OR operator) 。
位或运算符 12 级
“ | ”按位或运算符(Bitwise inclusive OR operator) 。
逻辑与运算符 13级
“”逻辑与运算符 。
逻辑或运算符 14 级
“ || ”逻辑或运算符 。
三元条件运算符 15级
? :条件运算符 。
赋值运算符 16 级
=、 +=、 -=、 *=、 /=、 %=、 =、 ^=、 |=、 =、 =赋值运算符 。
逗号运算符 17级
“,”逗号运算符 。
[pre]C 语言中,逗号(,)也可以是运算符,称为逗号运算符(Comma Operator) 。逗号运算符可以把两个以上(包含两个)的表达式连接成一个表达式,称为逗号表达式 。其一般形式为:
子表达式1, 子表达式2, ..., 子表达式n
例如:
a + b, c = b, c++
逗号运算符的优先级是所有运算符中级别最低的,通常配合 for 循环使用 。逗号表达式最右边的子表达式的值即为逗号表达式的值 。上例中,c++ 的值(c 自增之前的值)即为该表达式的值 。
逗号运算符保证左边的子表达式运算结束后才进行右边的子表达式的运算 。也就是说,逗号运算符是一个序列点,其左边所有副作用都结束后,才对其右边的子表达式进行运算 。因此,上例中,c 得到 b 的值后,才进行自增运算 。
优先级:C语言中,运算符的运算优先级共分为15 级 。1 级最高,15 级最低 。在表达式中,优先级较高的先于优先级较低的进行运算 。而在一个运算量两侧的运算符 优先级相同时,则按运算符的结合性所规定的结合方向处理 。
结合性:C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左) 。例如算术运算符的结合性是自左至右,即先左后右 。如有表达式x-y+z 则y 应先与“-”号结合 , 执行x-y 运算,然后再执行+z 的运算 。这种自左至右的结合 方向就称为“左结合性” 。而自右至左的结合方向称为“右结合性” 。最典型的右结合 性运算符是赋值运算符 。如x=y=z,由于“=”的右结合性,应先执行y=z 再执行x=(y=z)运算 。C语言运算符中有不少为右结合性 , 应注意区别,以避免理解错误 。
优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级 。
所有的优先级中,只有三个优先级是从右至左结合的 , 它们是单目运算符、条件运算符、赋值运算符 。其它的都是从左至右结合 。
具有最高优先级的其实并不算是真正的运算符 , 它们算是一类特殊的操作 。()是与函数相关,[]与数组相关,而-及.是取结构成员 。
其次是单目运算符,所有的单目运算符具有相同的优先级,因此在我认为的 真正的运算符中它们具有最高的优先级,又由于它们都是从右至左结合的 , 因此*p++与*(p++)等效是毫无疑问的 。
另外在C语言里,没有前置后置之分,因为++ -- 是右结合所以右侧优先运算,表现为 "操作数后置优先级比较高" 的假象,前置和后置的区分是因为运算符重载而后加入C++的
接下来是算术运算符,*、/、%的优先级当然比+、-高了 。
移位运算符紧随其后 。
其次的关系运算符中,==要比 == !=高一个级别,不大好理解 。
所有的逻辑操作符都具有不同的优先级(单目运算符除外 , C语言中函数参数处理顺序!和~)
逻辑位操作符的"与"比"或"高 , 而"异或"则在它们之间 。
跟在其后的比||高 。
接下来的是条件运算符,赋值运算符及逗号运算符 。

推荐阅读