- 第一优先级:括号运算符(())和数组下标运算符([])以及成员访问运算符(.和->)
- 括号运算符用于改变运算顺序。例如
(a + b)*c
,先计算括号内的a + b
。 - 数组下标运算符用于访问数组元素,如
a[3]
。 - 成员访问运算符用于访问结构体或联合体中的成员,如
struct student s; s.age
(通过对象访问)或者struct student *p; p->age
(通过指针访问)。
- 括号运算符用于改变运算顺序。例如
- 第二优先级:一元运算符(如++、–、!、~、-、+、*、&)
- 自增(
++
)和自减(--
)运算符有前置和后置之分。前置是先改变变量的值再使用,后置是先使用变量的值再改变。例如int a = 1; int b=++a;
(b
的值为2,a
的值为2),int c = 1; int d = c++;
(d
的值为1,c
的值为2)。 !
是逻辑非运算符,将真变为假,假变为真。例如int a = 0; int b=!a;
(b
的值为1)。~
是按位取反运算符,对一个整数的二进制位进行取反操作。-
和+
在这里作为一元运算符时,分别表示取负和取正。例如int a=-3;
(取负),int b = +4;
(取正,通常可以省略+
)。*
作为一元运算符是指针运算符,用于访问指针所指向的内容。例如int a = 10; int *p=&a; int b=*p;
(b
的值为10)。&
是取地址运算符,用于获取变量的地址。例如int a; int *p = &a;
获取a
的地址并赋值给p
。
- 自增(
- 第三优先级:算术运算符(乘除模:*、/、%)
- 乘法、除法和取模运算优先级相同。例如
int a = 6/2*3;
(先计算6/2
得到3,再乘以3,结果为9),int b = 7%3;
(结果为1)。
- 乘法、除法和取模运算优先级相同。例如
- 第四优先级:算术运算符(加减:+、-)
- 加法和减法优先级相同。例如
int a = 3 + 4-2;
(先计算3 + 4
得到7,再减去2,结果为5)。
- 加法和减法优先级相同。例如
- 第五优先级:移位运算符(左移:«,右移:»)
- 左移运算符
<<
是将一个数的二进制位向左移动指定的位数,右边补0。例如int a = 1<<3;
(1的二进制是00000001
,左移3位后得到00001000
,即8)。 - 右移运算符
>>
是将一个数的二进制位向右移动指定的位数。如果是无符号数,左边补0;如果是有符号数,左边补符号位。例如unsigned int b = 8>>2;
(8的二进制是00001000
,右移2位后得到00000010
,即2)。
- 左移运算符
- 第六优先级:关系运算符(<、<=、>、>=)
- 用于比较两个值的大小关系。例如
int a = 3; int b = 5; int c=a < b;
(c
的值为1,因为3小于5)。
- 用于比较两个值的大小关系。例如
- 第七优先级:关系运算符(==、!=)
- 用于判断两个值是否相等或不相等。例如
int a = 3; int b = 3; int c=a == b;
(c
的值为1)。
- 用于判断两个值是否相等或不相等。例如
- 第八优先级:逻辑与运算符(&&)
- 只有当两个操作数都为真时,结果才为真。例如
int a = 1; int b = 0; int c=a && b;
(c
的值为0)。
- 只有当两个操作数都为真时,结果才为真。例如
- 第九优先级:逻辑或运算符(||)
- 只要两个操作数中有一个为真,结果就为真。例如
int a = 1; int b = 0; int c=a || b;
(c
的值为1)。
- 只要两个操作数中有一个为真,结果就为真。例如
- 第十优先级:条件运算符(?:)
- 这是一个三目运算符,语法为
表达式1?表达式2:表达式3
。如果表达式1
为真,则返回表达式2
的值,否则返回表达式3
的值。例如int a = 3; int b = 5; int c=(a > b)?a:b;
(c
的值为5)。
- 这是一个三目运算符,语法为
- 第十一优先级:赋值运算符(=、+=、-=、*=、/=、%=、«=、»=、&=、^=、|=)
- 基本的赋值运算符
=
用于将一个值赋给一个变量。例如int a; a = 3;
。 - 复合赋值运算符是先进行算术或位运算,然后再赋值。例如
int a = 3; a += 2;
(相当于a = a+2
,结果为5)。
- 基本的赋值运算符
- 第十二优先级:逗号运算符(,)
- 逗号运算符用于将多个表达式连接起来,从左到右依次计算表达式的值,整个逗号表达式的值等于最后一个表达式的值。例如
int a = (3, 4, 5);
(a
的值为5)。
- 逗号运算符用于将多个表达式连接起来,从左到右依次计算表达式的值,整个逗号表达式的值等于最后一个表达式的值。例如
下表将按运算符优先级从高到低列出各个运算符,具有较高优先级的运算符出现在表格的上面,具有较低优先级的运算符出现在表格的下面。在表达式中,较高优先级的运算符会优先被计算。
类别 | 运算符 | 结合性 |
---|---|---|
后缀 | () [] -> . ++ -- | 从左到右 |
一元 | + - ! ~ ++ -- (type)* & sizeof | 从右到左 |
乘除 | * / % | 从左到右 |
加减 | + - | 从左到右 |
移位 | << >> | 从左到右 |
关系 | < <= > >= | 从左到右 |
相等 | == != | 从左到右 |
位与 AND | & | 从左到右 |
位异或 XOR | ^ | 从左到右 |
位或 OR | | | 从左到右 |
逻辑与 AND | && | 从左到右 |
逻辑或 OR | || | 从左到右 |
条件 | ?: | 从右到左 |
赋值 | = += -= *= /= %= >>= <<= &= ^= |= | 从右到左 |
逗号 | , | 从左到右 |