C语言运算符优先级大揭秘:轻松掌握编程小技巧


1. 算术运算符(如 `+`, `-`, ``, `/`)

- 从左到右计算,遇到乘除优先于加减。

- 例如:`a + b c / d` 先计算 `(a + b) c`,然后是 `(a + b) c / d`。

2. 关系运算符(如 ``, `==`, `!=`)

- 从左到右计算,但比较操作符优先级高于赋值操作符。

- 例如:`if (a < b) { / ... / }` 先判断 `a < b`,然后执行相应的代码块。

3. 逻辑运算符(如 `&&`, `||`)

- 从左到右计算,但逻辑与优先级高于逻辑或。

- 例如:`if (a && b) { / ... / }` 先判断 `a && b`,然后执行相应的代码块。

4. 位运算符(如 `&`, `|`, `~`, `>`)

- 从左到右计算,但位与和位或优先级高于位异或和位移。

- 例如:`a << 5;` 先将 `a` 左移5位,然后进行其他操作。

5. 逗号运算符(如 `,`)

- 从左到右计算,但逗号运算符优先级低于括号。

- 例如:`a, b, c;` 先计算 `a, b`,然后是 `c`。

6. 赋值运算符(如 `=`, `+=`, `-=`, `=`, `/=`, `%=`, `&=`, `^=`, `>=`)

- 从左到右计算,但赋值运算符优先级高于算术运算符。

- 例如:`a = a + b;` 先进行加法操作,然后将结果赋值给 `a`。

7. 空运算符(如 `;`)

- 从左到右计算,但空运算符优先级最高。

- 例如:`;` 会立即停止程序的执行。

8. 类型转换运算符(如 `(int)`, `(float)`, `(double)`)

- 从左到右计算,但类型转换运算符优先级高于算术运算符。

- 例如:`(int) a;` 将 `a` 转换为整数类型。

9. 逗号运算符和分号运算符(如 `{ }`)

- 从左到右计算,但逗号运算符优先级高于分号。

- 例如:`{ if (a) { / ... / } else { / ... / }` 先判断 `if (a)`,然后执行相应的代码块。

10. 函数参数传递

- 从左到右计算,但函数参数传递优先级高于函数调用。

- 例如:`printf("%d", a);` 先打印变量 `a` 的值。

11. 数组名作为变量名

- 从左到右计算,但数组名作为变量名时不参与计算。

- 例如:`a[i] = b;` 直接赋值,不参与后续计算。

12. 指针运算符(如 ``, `->`, `&`, `[]`)

- 从左到右计算,但指针运算符优先级高于算术运算符。

- 例如:`p;` 先解引用指针 `p`,然后是指针本身。

13. 字符串连接

- 从左到右计算,但字符串连接优先级高于算术运算符。

- 例如:`strcat(str, "hello");` 先连接字符串 `str` 和 "hello",然后是原字符串。

14. 条件运算符(如 `?:`)

- 从左到右计算,但条件运算符优先级高于算术运算符。

- 例如:`a > b ? a : b;` 先判断 `a > b`,然后是结果赋值给 `a`。

15. 逗号运算符和分号运算符(如 `{ }`)

- 从左到右计算,但逗号运算符优先级高于分号。

- 例如:`{ if (a) { / ... / } else { / ... / }` 先判断 `if (a)`,然后执行相应的代码块。

16. 函数返回值

- 从左到右计算,但函数返回值优先级高于函数调用。

- 例如:`return a + b;` 先返回变量 `a + b` 的结果。

17. 异常处理

- 从左到右计算,但异常处理优先级高于函数调用。

- 例如:`try { / ... / } catch (...) { / ... / }` 先尝试执行 `try` 块中的代码,如果发生异常则进入 `catch` 块。

18. 宏定义

- 从左到右计算,但宏定义优先级高于函数调用。

- 例如:`define PI 3.14159;` 先定义宏 `PI`,然后使用该宏。

19. 格式化输出

- 从左到右计算,但格式化输出优先级高于函数调用。

- 例如:`printf("%f", a);` 先格式化输出变量 `a`。

20. 文件操作

- 从左到右计算,但文件操作优先级高于函数调用。

- 例如:`fopen("file.txt", "r");` 先打开文件,然后是文件名。

21. 结构体和联

- 从左到右计算,但结构体和联成员的访问优先级高于函数调用。

- 例如:`struct { int a; int b; } t; t.a = 10; t.b = 20;` 先访问结构体成员 `t.a` 和 `t.b`。

22. 指针运算符(如 ``, `->`, `&`, `[]`)

- 从左到右计算,但指针运算符优先级高于算术运算符。

- 例如:`p;` 先解引用指针 `p`,然后是指针本身。

23. 数组名作为变量名

- 从左到右计算,但数组名作为变量名时不参与计算。

- 例如:`a[i] = b;` 直接赋值,不参与后续计算。

24. 函数参数传递

- 从左到右计算,但函数参数传递优先级高于函数调用。

- 例如:`printf("%d", a);` 先打印变量 `a` 的值。

25. 字符串连接

- 从左到右计算,但字符串连接优先级高于算术运算符。

- 例如:`strcat(str, "hello");` 先连接字符串 `str` 和 "hello",然后是原字符串。

26. 条件运算符(如 `?:`)

- 从左到右计算,但条件运算符优先级高于算术运算符。

- 例如:`a > b ? a : b;` 先判断 `a > b`,然后是结果赋值给 `a`。

27. 逗号运算符和分号运算符(如 `{ }`)

- 从左到右计算,但逗号运算符优先级高于分号。

- 例如:`{ if (a) { / ... / } else { / ... / }` 先判断 `if (a)`,然后执行相应的代码块。

28. 函数返回值

- 从左到右计算,但函数返回值优先级高于函数调用。

- 例如:`return a + b;` 先返回变量 `a + b` 的结果。

29. 异常处理

- 从左到右计算,但异常处理优先级高于函数调用。

- 例如:`try { / ... / } catch (...) { / ... / }` 先尝试执行 `try` 块中的代码,如果发生异常则进入 `catch` 块。

30. 宏定义

- 从左到右计算,但宏定义优先级高于函数调用。

- 例如:`define PI 3.14159;` 先定义宏 `PI`,然后使用该宏。

31. 格式化输出

- 从左到右计算,但格式化输出优先级高于函数调用。

- 例如:`printf("%f", a);` 先格式化输出变量 `a`。

32. 文件操作

- 从左到右计算,但文件操作优先级高于函数调用。

- 例如:`fopen("file.txt", "r");` 先打开文件,然后是文件名。

33. 结构体和联

- 从左到右计算,但结构体和联成员的访问优先级高于函数调用。

- 例如:`struct { int a; int b; } t; t.a = 10; t.b = 20;` 先访问结构体成员 `t.a` 和 `t.b`。

34. 指针运算符(如 ``, `->`, `&`, `[]`)

- 从左到右计算,但指针运算符优先级高于算术运算符。

- 例如:`p;` 先解引用指针 `p`,然后是指针本身。

35. 数组名作为变量名

- 从左到右计算,但数组名作为变量名时不参与计算。

- 例如:`a[i] = b;` 直接赋值,不参与后续计算。

36. 函数参数传递

- 从左到右计算,但函数参数传递优先级高于函数调用。

- 例如:`printf("%d", a);` 先打印变量 `a` 的值。

37. 字符串连接

- 从左到右计算,但字符串连接优先级高于算术运算符。

- 例如:`strcat(str, "hello");` 先连接字符串 `str` 和 "hello",然后是原字符串。

38. 条件运算符(如 `?:`)

- 从左到右计算,但条件运算符优先级高于算术运算符。

- 例如:`a > b ? a : b;` 先判断 `a > b`,然后是结果赋值给 `a`。

39. 逗号运算符和分号运算符(如 `{ }`)

- 从左到右计算,但逗号运算符优先级高于分号。

- 例如:`{ if (a) { / ... / } else { / ... / }` 先判断 `if (a)`,然后执行相应的代码块。

40. 函数返回值

- 从左到右计算,但函数返回值优先级高于函数调用。

- 例如:`return a + b;` 先返回变量 `a + b` 的结果。

41. 异常处理

- 从左到右计算,但异常处理优先级高于函数调用。

- 例如:`try { / ... / } catch (...) { / ... / }` 先尝试执行 `try` 块中的代码,如果发生异常则进入 `catch` 块。

42. 宏定义

- 从左到右计算,但宏定义优先级高于函数调用。

- 例如:`define PI 3.14159;` 先定义宏 `PI`,然后使用该宏。

43. 格式化输出

- 从左到右计算,但格式化输出优先级高于函数调用。

- 例如:`printf("%f", a);` 先格式化输出变量 `a`。

44. 文件操作

- 从左到右计算,但文件操作优先级高于函数调用。

- 例如:`fopen("file.txt", "r");` 先打开文件,然后是文件名。

45. 结构体和联

- 从左到右计算,但结构体和联成员的访问优先级高于函数调用。

- 例如:`struct { int a; int b; } t; t.a = 10; t.b = 20;` 先访问结构体成员 `t.a` 和 `t.b`。

46. 指针运算符(如 ``, `->`, `&`, `[]`)

- 从左到右计算,但指针运算符优先级高于算术运算符。

- 例如:`p;` 先解引用指针 `p`,然后是指针本身。

47. 数组名作为变量名

- 从左到右计算,但数组名作为变量名时不参与计算。

- 例如:`a[i] = b;` 直接赋值,不参与后续计算。

48. 函数参数传递

- 从左到右计算,但函数参数传递优先级高于函数调用。

- 例如:`printf("%d", a);` 先打印变量 `a` 的值。

49. 字符串连接

- 从左到右计算,但字符串连接优先级高于算术运算符。

- 例如:`strcat(str, "hello");` 先连接字符串 `str` 和 "hello",然后是原字符串。

50. 条件运算符(如 `?:`)

- 从左到右计算,但条件运算符优先级高于算术运算符。

- 例如:`a > b ? a : b;` 先判断 `a > b`,然后是结果赋值给 `a`。