1、运算符介绍
在C语言中,运算符优先级是指在表达式中执行运算的先后顺序。按照C语言的标准规范,不同的运算符被赋予了不同的优先级等级,优先级高的运算符会先进行运算。如果同一优先级的运算符出现在同一个表达式中,则按照从左到右或从右到左的结合性进行处理。
2、C语言运算符及其优先级
1) 最高优先级 - 圆括号和类型转换
- 运算符:
( )
(括号)、typecast
(类型转换) - 示例:
1int a = 10, b = 20; 2int c = (a + 5) * b; // 先计算括号内的a+5,然后乘以b 3char d = 'A'; 4int e = static_cast<int>(d); // 类型转换
2) 第二高优先级 - 一元运算符
- 运算符:
++
(前缀递增)、--
(前缀递减)、+
(正号,对于数值无效)、-
(负号)、!
(逻辑非)、~
(按位取反)、*
(指针解引用)、&
(取地址) - 示例:
1int x = 10; 2int y = ++x; // 先递增x,再赋值给y,所以y=11 3int z = *(&x); // 取x的地址,然后解引用,z仍等于11
3) 第三优先级 - 算术运算符
- 运算符:
*
(乘法)、/
(除法)、%
(模运算) - 示例:
1int m = 10, n = 3; 2int p = m * n / 2; // 首先计算乘法m*n得到30,再除以2,p=15
4) 第四优先级 - 加法和减法
- 运算符:
+
(加法)、-
(减法) - 示例:
1int o = 10, q = 5; 2int r = o + q - 3; // 先计算加法o+q得到15,再减去3,r=12
5) 第五优先级 - 移位运算符
- 运算符:
<<
(左移)、>>
(右移) - 示例:
1unsigned int u = 10; 2int shift = 2; 3int s = u << shift; // 将u左移两位,s=40(假设int为32位)
6) 第六优先级 - 关系运算符和等于运算符
- 运算符:
<
(小于)、>
(大于)、<=
(小于等于)、>=
(大于等于)、==
(等于)、!=
(不等于) - 示例:
1if (m <= n && n != 0) { /* ... */ } // 先判断m是否小于等于n,然后判断n是否不等于0
7) 第七优先级 - 逻辑与 (&&
)
- 运算符:
&&
(逻辑与) - 示例:
1bool cond1 = true, cond2 = false; 2if (cond1 && cond2) {} // 由于逻辑与,如果cond1为真,则检查cond2,此处不会执行if块
8) 第八优先级 - 逻辑或 (||
)
- 运算符:
||
(逻辑或) - 示例:
1if (cond1 || cond2) {} // 如果cond1为真,由于逻辑或,不会检查cond2,直接执行if块
9) 第九优先级 - 条件运算符
- 运算符:
?:
(三元运算符) - 示例:
1int val = cond1 ? m : n; // 如果cond1为真,则val=m,否则val=n
10) 第十优先级 - 赋值运算符和其他复合赋值运算符
- 运算符:
=
(赋值),=
,+=
,-=
,*=
,/=
,%=
,<<=
,>>=
,&=
,^=
,|=
- 示例:
1int v = 0; 2v += m; // 等价于 v = v + m
11) 最低优先级 - ,
(逗号运算符)
- 运算符:
,
(逗号) - 示例:
1int i = 0, j = 1; 2int k = (i = 5, j = 10, i + j); // 先计算i=5,然后j=10,最后返回i+j的结果15
根据上述排序,优先级是从上至下逐渐降低的。例如,乘法和除法运算符的优先级高于加法和减法运算符。这意味着在没有括号的情况下,乘法和除法会先于加法和减法进行计算。同样地,一元运算符(如 !
、++
)的优先级高于任何二元运算符(如 +
、*
)。在优先级相同的运算符之间,通常按照运算符的结合性(左结合或右结合)决定运算顺序。例如,逻辑与 &&
和逻辑或 ||
同属一个优先级,它们都是左结合的,因此会从左向右评估。
注意:C和C++中的运算符优先级基本一致,这里的示例适用于两种语言。要详细了解所有C语言运算符及其完整的优先级列表,请查阅官方文档或相关参考资料。