【C语言】符号优先级详解 -《谁与争锋 ! 》

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. 参考文献

  1. Kernighan, B. W., & Ritchie, D. M. (1988). The C Programming Language (2nd ed.). Prentice Hall.
  2. ISO/IEC. (1999). ISO/IEC 9899:1999. Programming Languages – C.
  3. ISO/IEC. (2024). ISO/IEC DIS 9899. Programming Languages – C.
  4. Harbison, S. P., & Steele, G. L. (2002). C: A Reference Manual (5th ed.). Prentice Hall.

7. 结束语

  1. 本节内容已经全部介绍完毕,希望通过这篇文章,大家对C语言中的符号优先级有了更深入的理解和认识。
  2. 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持

相关推荐

  1. C语言符号优先级详解 -《 ! 》

    2024-07-11 16:56:04       25 阅读
  2. C语言逻辑符号数学逻辑符号的联系

    2024-07-11 16:56:04       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 16:56:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 16:56:04       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 16:56:04       58 阅读
  4. Python语言-面向对象

    2024-07-11 16:56:04       69 阅读

热门阅读

  1. 差分进化算法

    2024-07-11 16:56:04       16 阅读
  2. 【Docker 入门】

    2024-07-11 16:56:04       25 阅读
  3. 从零手写实现 nginx-26-rewrite url 重写

    2024-07-11 16:56:04       22 阅读
  4. 虚拟化平台主流hypervisor工作原理分析

    2024-07-11 16:56:04       18 阅读
  5. 常用知识点问答

    2024-07-11 16:56:04       21 阅读
  6. SQL MySQL定时器/事件调度器(Event Scheduler)

    2024-07-11 16:56:04       24 阅读
  7. Unity 改造编辑器组件字段显示

    2024-07-11 16:56:04       24 阅读
  8. 解决selenium手动下载驱动问题

    2024-07-11 16:56:04       20 阅读
  9. 文本大模型下游任务与peft微调实战

    2024-07-11 16:56:04       20 阅读