目录
- C语言符号优先级详细解析
- 1. 运算符优先级表
- 2. 优先级和结合性详解
- 2.1 括号运算符 `()`, `[]`, `.`, `->`
- 2.2 递增递减运算符 `++`, `--`
- 2.3 一元运算符 `+`, `-`, `!`, `~`, `*`, `&`, `(type)`, `sizeof`
- 2.4 乘法、除法、取模运算符 `*`, `/`, `%`
- 2.5 加法和减法运算符 `+`, `-`
- 2.6 移位运算符 `<<`, `>>`
- 2.7 关系运算符 `<`, `<=`, `>`, `>=`
- 2.8 相等运算符 `==`, `!=`
- 2.9 按位运算符 `&`, `^`, `|`
- 2.10 逻辑运算符 `&&`, `||`
- 2.11 条件运算符 `? :`
- 2.12 赋值运算符 `=`, `+=`, `-=`, `*=`, `/=`, `%=`, `<<=`, `>>=`, `&=`, `^=`, `|=`
- 2.13 逗号运算符 `,`
- 3. 优先级和结合性示例
- 4. 总结
- 6. 参考文献
- 7. 结束语
C语言符号优先级详细解析
在C语言中,不同的运算符具有不同的优先级和结合性,这决定了在表达式中运算符的计算顺序。理解这些优先级和结合性是正确编写和理解C语言程序的基础。本文将详细解析C语言中的符号优先级,包括各类运算符的优先级、结合性及其应用示例。
在 评论 区对文章做出评价,博主免费赠送 最新2024版本C语言ISO/IEC国际标准
。
1. 运算符优先级表
下表列出了C语言中各类运算符的优先级和结合性,从高到低排列:
优先级 | 运算符 | 描述 | 结合性 |
---|---|---|---|
1 | () | 小括号 | 左到右 |
[] | 数组下标 | 左到右 | |
. | 成员选择 | 左到右 | |
-> | 成员选择(通过指针) | 左到右 | |
2 | ++ | 后置递增 | 左到右 |
-- | 后置递减 | 左到右 | |
3 | ++ | 前置递增 | 右到左 |
-- | 前置递减 | 右到左 | |
+ | 正号 | 右到左 | |
- | 负号 | 右到左 | |
! | 逻辑非 | 右到左 | |
~ | 按位取反 | 右到左 | |
* | 指针解引用 | 右到左 | |
& | 取地址 | 右到左 | |
(type) | 类型转换 | 右到左 | |
sizeof | 取大小 | 右到左 | |
4 | * | 乘法 | 左到右 |
/ | 除法 | 左到右 | |
% | 取模 | 左到右 | |
5 | + | 加法 | 左到右 |
- | 减法 | 左到右 | |
6 | << | 左移 | 左到右 |
>> | 右移 | 左到右 | |
7 | < | 小于 | 左到右 |
<= | 小于等于 | 左到右 | |
> | 大于 | 左到右 | |
>= | 大于等于 | 左到右 | |
8 | == | 等于 | 左到右 |
!= | 不等于 | 左到右 | |
9 | & | 按位与 | 左到右 |
10 | ^ | 按位异或 | 左到右 |
11 | ` | ` | 按位或 |
12 | && | 逻辑与 | 左到右 |
13 | ` | ` | |
14 | ? : | 条件运算符 | 右到左 |
15 | = | 赋值 | 右到左 |
+= | 加赋值 | 右到左 | |
-= | 减赋值 | 右到左 | |
*= | 乘赋值 | 右到左 | |
/= | 除赋值 | 右到左 | |
%= | 模赋值 | 右到左 | |
<<= | 左移赋值 | 右到左 | |
>>= | 右移赋值 | 右到左 | |
&= | 按位与赋值 | 右到左 | |
^= | 按位异或赋值 | 右到左 | |
` | =` | 按位或赋值 | |
16 | , | 逗号 | 左到右 |
2. 优先级和结合性详解
2.1 括号运算符 ()
, []
, .
, ->
这些运算符的优先级最高,用于函数调用、数组下标访问、结构体成员访问。
int arr[3] = {1, 2, 3};
printf("%d\n", arr[0]); // 输出: 1
2.2 递增递减运算符 ++
, --
分为前置和后置递增、递减运算符。前置运算符优先级高于后置运算符。
int a = 5;
printf("%d\n", ++a); // 输出: 6 (前置递增,先增加后使用)
printf("%d\n", a++); // 输出: 6 (后置递增,先使用后增加)
2.3 一元运算符 +
, -
, !
, ~
, *
, &
, (type)
, sizeof
用于正负号、逻辑非、按位取反、指针解引用、取地址、类型转换和取大小。
int a = -5;
int b = !a; // b的值为0 (逻辑非)
2.4 乘法、除法、取模运算符 *
, /
, %
用于基本的数学运算。
int a = 10;
int b = 3;
printf("%d\n", a * b); // 输出: 30
printf("%d\n", a / b); // 输出: 3
printf("%d\n", a % b); // 输出: 1
2.5 加法和减法运算符 +
, -
用于基本的数学运算。
int a = 5;
int b = 3;
printf("%d\n", a + b); // 输出: 8
printf("%d\n", a - b); // 输出: 2
2.6 移位运算符 <<
, >>
用于按位左移和右移。
int a = 4; // 二进制: 100
int b = a << 1; // 左移1位: 1000 (8)
int c = a >> 1; // 右移1位: 10 (2)
printf("%d, %d\n", b, c); // 输出: 8, 2
2.7 关系运算符 <
, <=
, >
, >=
用于比较操作。
int a = 5;
int b = 3;
printf("%d\n", a > b); // 输出: 1 (true)
2.8 相等运算符 ==
, !=
用于判断相等和不等。
int a = 5;
int b = 5;
printf("%d\n", a == b); // 输出: 1 (true)
printf("%d\n", a != b); // 输出: 0 (false)
2.9 按位运算符 &
, ^
, |
用于按位与、异或和或操作。
int a = 5; // 二进制: 101
int b = 3; // 二进制: 011
printf("%d\n", a & b); // 输出: 1 (001)
printf("%d\n", a ^ b); // 输出: 6 (110)
printf("%d\n", a | b); // 输出: 7 (111)
2.10 逻辑运算符 &&
, ||
用于逻辑与和逻辑或操作。
int a = 1;
int b = 0;
printf("%d\n", a && b); // 输出: 0 (false)
printf("%d\n", a || b); // 输出: 1 (true)
2.11 条件运算符 ? :
用于条件表达式(三元运算符)。
int a = 5;
int b = 3;
int max = (a > b) ? a : b; // max的值为5
printf("%d\n", max); // 输出: 5
2.12 赋值运算符 =
, +=
, -=
, *=
, /=
, %=
, <<=
, >>=
, &=
, ^=
, |=
用于赋值操作。
int a = 5;
a += 3; // a的值为8
a *= 2; // a的值为16
printf("%d\n", a); // 输出: 16
2.13 逗号运算符 ,
用于分隔多个表达式,返回最后一个表达式的值。
int a = 1, b = 2, c;
c = (a += 2, b += 3, a + b); // a的值为3, b的值为5, c的值为8
printf("%d\n", c); // 输出: 8
3. 优先级和结合性示例
为了更好地理解运算符的优先级和结合性,以下通过几个示例进行说明。
示例1:结合性
int a = 5, b = 10, c = 15;
int result = a + b * c; // 优先级:先计算 b * c,结果为150,然后 a + 150,结果为155
printf("%d\n", result); // 输出: 155
在这个例子中,乘法运算符 *
的优先级高于加法运算符 +
,因此先计算 b * c
,再计算 a + (b * c)
。
示例2:括号改变优先级
int a = 5, b = 10, c = 15;
int result = (a + b) * c; // 使用括号改变优先级,先计算 a + b,结果为15,然后 15 * c,结果为225
printf("%d\n", result); // 输出: 225
在这个例子中,括号 ()
改变了计算顺序,使得加法 a + b
先于乘法 *
被计算。
示例3:逻辑运算
int a = 1, b = 0, c = 1;
int result = a && b || c; // 优先级:先计算 a && b,结果为0,然后 0 || c,结果为1
printf("%d\n", result); // 输出: 1
在这个例子中,逻辑与运算符 &&
的优先级高于逻辑或运算符 ||
,因此先计算 a && b
,再计算 0 || c
。
示例4:赋值运算结合性
int a, b, c;
a = b = c = 10; // 结合性:从右到左,先计算 c = 10,然后 b = c,最后 a = b
printf("%d %d %d\n", a, b, c); // 输出: 10 10 10
在这个例子中,赋值运算符 =
的结合性是从右到左,因此先计算 c = 10
,再计算 b = c
,最后计算 a = b
。
4. 总结
理解C语言中的运算符优先级和结合性是编写正确代码的关键。本文详细介绍了C语言中的各种运算符、它们的优先级和结合性,并通过示例展示了如何正确使用这些运算符。掌握这些知识,将有助于编写出逻辑严谨、结构清晰的C语言程序。
6. 参考文献
- Kernighan, B. W., & Ritchie, D. M. (1988). The C Programming Language (2nd ed.). Prentice Hall.
- ISO/IEC. (1999). ISO/IEC 9899:1999. Programming Languages – C.
- ISO/IEC. (2024). ISO/IEC DIS 9899. Programming Languages – C.
- Harbison, S. P., & Steele, G. L. (2002). C: A Reference Manual (5th ed.). Prentice Hall.
7. 结束语
- 本节内容已经全部介绍完毕,希望通过这篇文章,大家对C语言中的符号优先级有了更深入的理解和认识。
- 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持!LuckiBit