C语言运算符号指的是运算符号。C语言中的符号分为10类:算术运算符、关系运算符、逻辑运算符、位操作运算符、赋值运算符、条件运算符、逗号运算符、指针运算符、求字节数运算符和特殊运算符。
一、种类
算术运算符
用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。
关系运算符
用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。
逻辑运算符
用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
位操作运算符
参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。
赋值运算符
用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
条件运算符
这是一个三目运算符,用于条件求值(?:)。
逗号运算符
用于把若干表达式组合成一个表达式(,)。
指针运算符
用于取内容(*)和取地址(&)二种运算。
求字节数运算符
用于计算数据类型所占的字节数(sizeof)。
特殊运算符
有括号(),下标[],成员(→,.)等几种。
C语言是一种运算符非常丰富的语言,多达34种。其中C语言中*号出现频率非常高,其用法分成了9类:乘法运算符、复合赋值运算苏、假读符、注释符、普通符号、指针定义符、指向运算符、行列地址转换符和地址值符。
二、运算符号的优先级
1、优先级1级
结合方向 左结合(自左至右)
( ) 圆括号
[ ]下标运算符
-> 指向结构体成员运算符
. 结构体成员运算符(请注意它是一个实心圆点)
2、优先级2级
结合方向 右结合(自右至左)单目运算符
! 逻辑非运算符
~ 按位取反运算符
++ 自增运算符
-- 自减运算符
- 负号运算符
(类型) 类型转换运算符
* 指针运算符
& 地址与运算符
sizeof 长度运算符
3、优先级3级
结合方向 左结合 双目运算符
* 乘法运算符
/ 除法运算符
% 取余运算符
4、优先级4级
结合方向 左结合 双目运算符
+ 加法运算符
- 减法运算符
5、优先级5级
结合方向 左结合 双目运算符
<< 左移运算符
>> 右移运算符
6、优先级6级
结合方向 左结合 双目运算符
<、<=、>、>= 关系运算符
7、优先级7级
结合方向 左结合 双目运算符
== 等于运算符 (判断)
!= 不等于运算符(判断)
8、优先级8级
结合方向 左结合 双目运算符
& 按位与运算符
9、优先级9级
结合方向 左结合 双目运算符
^ 按位异或运算符
10、优先级10级
结合方向 左结合 双目运算符
| 按位或运算符 举例:0xfe|0xef 即为1111 1110 与1110 1111按位或运算则答案为:1111 1111 即0xff。
11、优先级11级
结合方向 左结合 双目运算符
&& 逻辑与运算符
12、优先级12级
结合方向 左结合 双目运算符
|| 逻辑或运算符
13、优先级13级
结合方向 右结合 三目运算符
? : 条件运算符
14、优先级14级
结合方向 右结合 双目运算符
= 赋值运算符
+ = 加后赋值运算符 如s+=1表示s=s+1
- = 减后赋值运算符 如s-=1表示s=s-1
* = 乘后赋值运算符
/ = 除后赋值运算符
% = 取模后赋值运算符
< <= 左移后赋值运算符
>>=右移后赋值运算符
&= 按位与后赋值运算符
^=按位异或后赋值运算符
|= 按位或后赋值运算符
15、优先级15级
结合方向 左结合
, 逗号运算符
三、有关概念
优先级
优先级是用来标识运算符在表达式中的运算顺序的,在求解表达式的值的时候,总是先按运算符的优先次序由高到低进行操作。
结合性
当一个运算对象两侧的运算符优先级别相同时,则按运算符的结合性来确定表达式的运算顺序。关于结合性的概念在其他高级语言中是没有的,这是C语言的特点之一。在标准C语言的文档里,对操作符的结合性并没有做出非常清楚的解释。一个满分的回答是:它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。C语言也将 34 种运算符规定了不同的结合性。大多数运算符结合方向是"自左至右",即:先左后右,也叫"左结合性",例如 a-b + c,表达式中有-和+两种运算符,且优先级相同,按先左后右结合方向,先围绕减号结合,执行 a-b 的运算,再围绕加号结合,完成运算(a-b) + c。除了左结合性外,C 语
言有三类运算符的结合方向是从右至左,也叫"右结合性",即:单目运算符、条件运算符、以及赋值运算符。着重强调一点,无论是左结合性,还是右结合性,是针对两个相邻的优先级相同的运行符言(不是表达中的运算对象),运算符是决定左右的基准点,先以前面的运算符(即位置上处于左边的运算符)构造运算,就是左结合,反之,就是右结合。与运算符及表达式相关的重要概念,除运算符优先级和结合性外,C 标准定义的副作用(Side Effects)和序列点(Sequence Point)也是不可或缺的两个概念。
副作用
C标准对副作用的定义是,访问易变(Volatile)型变量、修改变量、修改文件、以及调用执行前述操作的函数都是副作用。副作用可以简单理解成,作为表达式求值过程中的副产品,某些变量的值发生了修改。
序列点
序列点是程序执行中的一个点,在这个点之前,前面的表达式的求值和副作用已经完成,而后面表达式的求值和副作用还没有发生。C 标准定义以下序列点:
(1)运算符&&;运算符||;逗号运算符,;条件运算符?:的第一个子表达式求值结束后;
(2)函数调用运算符()中对所有实参数完成求值之后;
(3)每个完整表达式结束时。完整表达式包括变量初始化表达式,表达式语句的表达式,return 语句的表达式,if 或 switch 语句中的控制表达式,while 或 do语句的控制表达式,for 语句的所有三个表达式;
(4)标准库函数返回之前,标准输入输出函数格式化转换说明符关联动作之后,标准查找函数和排序函数在调用比较函数之前和之后及参数传递之后.
由序列点的定义可知,与运算符&&;或运算符||;逗号运算符,;条件运算符?:等 4 个运算符的左操作数属于前一个序列点,右操作数属于后一个序列点,因此,这 4 个运算符的左操作数的求值要先于右操作数完成