C语言所有运算符及优先级、结合性
C 语言所有运算符及优先级、结合性
参考:《C Primer Plus 第六版》
Tip:有关优先级、结合性的表格在最后面。
【1】算数运算符
-
‘+’(“加号”)(二元)【
表达式1
+表达式2
】:把表达式2
的值加到表达式1
的值上。 -
'+'(“正号”)(一元)【+
表达式
】:生成一个大小和符号都与右边表达式
的值相同的值。 -
'-'(“减号”)(二元)【
表达式1
-表达式2
】:从表达式1
的值中减去表达式2
的值。 -
'-'(“负号”)(一元)【-
表达式
】:生成一个与右边表达式
的值大小相等符号相反的值。 -
'*'(“乘号”)(二元)【
表达式1
*****表达式2
】:把表达式1
的值乘以表达式2
的值。 -
'/'(“除号”)(二元)【
表达式1
/表达式2
】:把表达式1
的值除以表达式2
的值:如果两个运算对象都是整数,其结果要被截断。 -
'%'(“求模/取余”)(二元)【
表达式1
%表达式2
】:得表达式1
的值除以表达式2
值时的余数。 -
'++'(“自增”)(一元)【++
表达式
/表达式
++】:把右边表达式
的值加1(前缀模式),或把左边表达式
的值加1(后缀模式)。 -
'--'(“自减”)(一元)【--
表达式
/表达式
--**】:把右边表达式
的值减1(前缀模式),或把左边表达式
的值减1(后缀模式)。
Tip:'+'(“正号”)和'-'(“负号”),又称符号运算符。
【2】关系运算符
- '<'(“小于号”)(二元)【
表达式1
<表达式2
】:用于判断表达式1
的值是否小于表达式2
的值。 - '<='(“小于等于号”)(二元)【
表达式1
<=表达式2
】:用于判断表达式1
的值是否小于或者等于表达式2
的值。 - '>'(“大于号”)(二元)【
表达式1
>表达式2
】:用于判断表达式1
的值是否大于表达式2
的值。 - '>='(“大于等于号”)(二元)【
表达式1
>=表达式2
】:用于判断表达式1
的值是否大于或者等于表达式2
的值。 - '=='(“等于号”)(二元)【
表达式1
==表达式2
】:用于判断表达式1
的值是否等于表达式2
的值。 - '!='(“不等于号”)(二元)【
表达式1
!=表达式2
】:用于判断表达式1
的值是否不等于表达式2
的值。
【3】逻辑运算符
- '&&'(逻辑与)(二元)【
表达式1
&&表达式2
】:表达式1
为真并且表达式2
为真则为真,否则为假(同真为真,有假即假)。 - '||'(逻辑或)(二元)【
表达式1
||表达式2
】:表达式1
为真或者表达式2
为真则为真,否则为假(有真则真,同假为假)。 - '!'(逻辑非)(一元)【!
表达式
】:右边表达式
为假时真,真时假(真变假,假变真)。
【4】条件运算符(三目运算符)
- ' ? : '(三元)【
表达式1
?表达式2
:表达式3
】:如果表达式1
为真,则整个表达式的值等于表达式2
的值,否则为表达式3
的值。
【5】 位运算符
- ''**(按位取反)(一元)【**
表达式
】:对表达式
的值的每一位取反(1变0,0变1)。 - '&'(按位与)(二元)【
表达式1
&表达式2
】:对表达式1
和表达式2
的值的每一位,进行“逻辑与”操作(同1为1,有0则0)。 - '|'(按位或)(二元)【
表达式1
|表达式2
】:对表达式1
和表达式2
的值的每一位,进行“逻辑或”操作(有1则1,同0为0)。 - '^'(按位异或)(二元)【
表达式1
^表达式2
】:对表达式1
和表达式2
的值的每一位,不同为1, 相同为0。 - '<<'(按位左移)(二元)【
表达式1
<<表达式2
】:把表达式1
的值的每一位向左移动表达式2
的值个单位,多余截断,空位补0。 - '>>'(按位右移)(二元)【
表达式1
>>表达式2
】:把表达式1
的值的每一位向右移动表达式2
的值个单位,多余截断,空位补0。
【6】赋值运算符
注意:所有被赋值的表达式
都需要能够被赋值。
C语言有一个基本赋值运算符和多个复合赋值运算符。
基本赋值运算符:
- '='(二元)【
表达式1
=表达式2
】:把表达式2
的值赋给表达式1
。
复合赋值运算符:
-
'+='(二元)【
表达式1
+=表达式2
】:相当于表达式1
=表达式1
+表达式2
。 -
'-='(二元)【
表达式1
-=表达式2
】:相当于表达式1
=表达式1
-表达式2
。 -
'*='(二元)【
表达式1
*=表达式2
】:相当于表达式1
=表达式1
*表达式2
。 -
'/='(二元)【
表达式1
/=表达式2
】:相当于表达式1
=表达式1
/表达式2
。 -
'%='(二元)【
表达式1
%=表达式2
】:相当于表达式1
=表达式1
%表达式2
。 -
'&='(二元)【
表达式1
&=表达式2
】:相当于表达式1
=表达式1
&表达式2
。 -
'|='(二元)【
表达式1
|=表达式2
】:相当于表达式1
=表达式1
|表达式2
。 -
'^='(二元)【
表达式1
^=表达式2
】:相当于表达式1
=表达式1
^表达式2
。 -
'>>='(二元)【
表达式1
>>=表达式2
】:相当于表达式1
=表达式1
>>表达式2
。 -
'<<='(二元)【
表达式1
<<=表达式2
】:相当于表达式1
=表达式1
<<表达式2
。
【7】与指针有关的运算符
- '&'(取地址)(一元)【&
表达式
】:获取右边表达式
的内存地址。表达式
应该是或者它的值应该代表一个变量。 - '*'(解引用/间接引用)(一元)【*****
表达式
】:获取右边表达式
所指向内存空间的值。表达式
应该是或者它的值应该代表一个指针变量。
【8】结构和联合运算符
- '.'(成员运算符)(二元)【
表达式1
.表达式2
】:用于访问结构或联合的成员。表达式1
应该是或者它的值应该代表一个结构或联合变量,表达式2
必须是表达式1
中的成员。 - '->'(间接成员运算符/或结构指针运算符)(二元)【
表达式1
->表达式2
】:用于访问结构或联合的成员。表达式1
应该是或者它的值应该代表一个结构或联合变量的指针,表达式2
必须是表达式1
中的成员。
【9】混合运算符
- 'sizeof'(一元)【sizeof(
表达式
)】:顾名思义,计算表达式
所占内存空间的大小,单位是char的大小,而char的大小通常是1字节。表达式
应该是或者它的值应该代表一个变量,或者应该是一种数据类型。当表达式
是或者它的值代表一个变量的时候,【sizeof(表达式
)】还可以写为【sizeof表达式
】(C11),但建议全部使用【sizeof(表达式
)】的写法。 - '_Alignof'(一元)【_Alignof(
类型
)】(C11):顾名思义,计算类型
的对齐方式,这个运算符只针对某种数据类型。对于GCC,Clang这两个编译器,还支持alignof的写法,但考虑到兼容性和可移植性,不建议使用。 - '(
数据类型
)'(一元)【(数据类型
)(表达式
)】:把表达式
的值强制转换成数据类型
类型的。对于【(数据类型
)(表达式
)】,还可以写成【数据类型
(表达式
)】或者【(数据类型
)表达式
】,至少有一个括号。
【10】其他运算符
以下四种运算符知道它们也算运算符即可,甚至不知道也没事,不必深究。
在书《C Primer Plus 第六版》的参考资料中,在列举C的运算符时,直接跳过了这四种运算符。
- '[]'(数组索引运算符)(二元)【
表达式1
[表达式2
]】:用于访问表达式1
的第表达式2
个元素,表达式1
应该是或者它的值应该代表一个数组,表达式2
应该是或者它的值应该代表一个非负整数。 - '{}'(复合语句或初始化列表):通常不把它当作运算符,但严格意义上它也是运算符,知道即可。
- '()'(函数调用运算符):用于调用函数以及向函数传递参数。
- ','(逗号运算符):用于链接多个表达式。
表格——优先级、结合性
下表按优先级从高到低的顺序列出了C语言运算符,并给出了其结合性。
运算符(优先级从高至低) | 结合性 |
---|---|
++(后缀) --(后缀) ()(函数调用) [ ] { }(复合字面量) . -> |
从左往右 |
++(前缀) --(前缀) - + ~ ! *(解引用) &(取地址) sizeof _Alignof |
从右往左 |
(类型名) | 从右往左 |
* / % | 从左往右 |
+ - | 从左往右 |
<< >> | 从左往右 |
< > <= >= | 从左往右 |
== != | 从左往右 |
& | 从左往右 |
^ | 从左往右 |
| | 从左往右 |
&& | 从左往右 |
|| | 从左往右 |
? : (条件表达式) | 从右往左 |
= *= /= += -= <<= >>= &= |= ^= | 从右往左 |
,(逗号运算符) | 从左往右 |