C语言中的运算符优先级决定了在没有括号的情况下,表达式中的各个部分应如何求值。这个优先级是固定的,并且遵循一定的规则。当运算符的优先级相同时,运算的方向(从左到右或从右到左)则称为运算符的结合性。
下面是一个简化的C语言运算符优先级列表(从高到低):
- 后缀运算符:
()
函数调用,[]
数组下标,->
结构体成员选择,.
结构体成员选择 - 一元运算符:
++
(后缀),--
(后缀),+
(取正),-
(取负),&
(取地址),*
(解引用),!
(逻辑非),~
(按位取反),sizeof
,typeof
,alignof
(C11),_Alignof
(C11) - 乘法类运算符:
*
(乘法),/
(除法),%
(取模) - 加法类运算符:
+
(加法),-
(减法) - 位移运算符:
<<
(左移),>>
(右移) - 关系运算符:
<
(小于),<=
(小于等于),>
(大于),>=
(大于等于) - 相等性运算符:
==
(等于),!=
(不等于) - 按位与运算符:
&
(按位与) - 按位异或运算符:
^
(按位异或) - 按位或运算符:
|
(按位或) - 逻辑与运算符:
&&
(逻辑与) - 逻辑或运算符:
||
(逻辑或) - 条件运算符:
?:
(三元运算符) - 赋值运算符:
=
,+=
,-=
,*=
,/=
,%=
,<<=
,>>=
,&=
,^=
,|=
- 逗号运算符:
,
对于同级运算符(即具有相同优先级的运算符),C语言采用从左到右的结合性。这意味着在没有括号的情况下,同级运算符将从左至右进行运算。例如,表达式 a = b = c = 5;
会从右向左进行赋值,即 c
首先被赋值为 5
,然后 b
被赋值为 c
的值(即 5
),最后 a
被赋值为 b
的值(即 5
)。
注意,虽然这个列表提供了一个大致的优先级顺序,但在编写复杂的表达式时,为了代码的可读性和避免潜在的错误,最好使用括号来明确指定运算的顺序。