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`。

