2024年10月18日 11:30

This commit is contained in:
许大仙 2024-10-18 03:30:34 +00:00
parent d0ed95f44e
commit bf44ed4820

View File

@ -2367,60 +2367,65 @@ int main() {
> [!NOTE]
>
> `优先级`和`结合性`的定义,如下所示:
>
> * ① 所谓的`优先级`:就是当多个运算符出现在同一个表达式中时,先执行哪个运算符。
> * ② 所谓的`结合性`:就是当多个相同优先级的运算符出现在同一个表达式中的时候,是从左到右运算,还是从右到左运算。
> * `左结合性`:具有相同优先级的运算符将`从左到右`(➡️)进行计算。
> * `右结合性`:具有相同优先级的运算符将`从右到左`(⬅️)进行计算。
>
> 总结:先看`优先级`;如果优先级相同,再看`结合性`。
* C 语言中运算符的优先级有几十个,有的运算符优先级不同,有的运算符优先级相同,如下所示:
| 优先级 | 运算符 | 名称或含义 | 结合方向 |
| ------ | ---------- | --------------------------------- | ------------- |
| `0` | `()` | 小括号,最高优先级 | ➡️(从左到右) |
| `1` | `++`、`--` | 后缀自增和自减i++、i-- 等 | ➡️(从左到右) |
| `1` | `()` | 小括号函数调用sum(1,2) 等 | ➡️(从左到右) |
| `1` | `.` | 成员选择(对象) | ➡️(从左到右) |
| | `->` | 成员选择(指针) | |
| **2** | `-` | 负号运算符 | ⬅️(从右到左) |
| | `(类型)` | 强制类型转换 | |
| | `++` | 自增运算符 | |
| | `--` | 自减运算符 | |
| | `*` | 取值运算符 | |
| | `&` | 取地址运算符 | |
| | `!` | 逻辑非运算符 | |
| | `~` | 按位取反运算符 | |
| | `sizeof` | 长度运算符 | |
| **3** | `/` | 除 | ➡️(从左到右) |
| | `*` | 乘 | |
| | `%` | 余数(取模) | |
| **4** | `+` | 加 | ➡️(从左到右) |
| | `-` | 减 | |
| **5** | `<<` | 左移 | ➡️(从左到右) |
| | `>>` | 右移 | |
| **6** | `>` | 大于 | ➡️(从左到右) |
| | `>=` | 大于等于 | |
| | `<` | 小于 | |
| | `<=` | 小于等于 | |
| **7** | `==` | 等于 | ➡️(从左到右) |
| | `!=` | 不等于 | |
| **8** | `&` | 按位与 | ➡️(从左到右) |
| **9** | `^` | 按位异或 | ➡️(从左到右) |
| **10** | `\|` | 按位或 | ➡️(从左到右) |
| **11** | `&&` | 逻辑与 | ➡️(从左到右) |
| **12** | `\|\|` | 逻辑或 | ➡️(从左到右) |
| **13** | `?:` | 条件运算符 | ⬅️(从右到左) |
| **14** | `=` | 赋值运算符 | ⬅️(从右到左) |
| | `/=` | 除后赋值 | |
| | `*=` | 乘后赋值 | |
| | `%=` | 取模后赋值 | |
| | `+=` | 加后赋值 | |
| | `-=` | 减后赋值 | |
| | `<<=` | 左移后赋值 | |
| | `>>=` | 右移后赋值 | |
| | `&=` | 按位与后赋值 | |
| | `^=` | 按位异或后赋值 | |
| | `\|=` | 按位或后赋值 | |
| **15** | `,` | 逗号运算符 | ➡️(从左到右) |
| 优先级 | 运算符 | 名称或含义 | 结合方向 |
| ------ | -------------- | ------------------------------------------- | ------------- |
| `0` | `()` | 小括号,最高优先级 | ➡️(从左到右) |
| `1` | `++`、`--` | 后缀自增和自减,如:`i++`、`i--` 等 | ➡️(从左到右) |
| | `()` | 小括号,函数调用,如:`sum(1,2)` 等 | |
| | `[]` | 数组下标,如:`arr[0]`、`arr[1]` 等 | |
| | `.` | 结构体或共用体成员访问 | |
| | `->` | 结构体或共用体成员通过指针访问 | |
| `2` | `++`、`--` | 前缀自增和自减,如:`++i`、`--i` 等 | ⬅️(从右到左) |
| | `+` | 一元加运算符,表示操作数的正,如:`+2` 等 | |
| | `-` | 一元减运算符,表示操作数的负,如:`-3` 等 | |
| | `!` | 逻辑非运算符(逻辑运算符) | |
| | `~` | 按位取反运算符(位运算符) | |
| | `typename` | 强制类型转换 | |
| | `*` | 解引用运算符 | |
| | `&` | 取地址运算符 | |
| | `sizeof` | 取大小运算符 | |
| `3` | `/` | 除法运算符(算术运算符) | ➡️(从左到右) |
| | `*` | 乘法运算符(算术运算符) | |
| | `%` | 取模(取余)运算符(算术运算符) | |
| `4` | `+` | 二元加运算符(算术运算符),如:`2 + 3` 等 | ➡️(从左到右) |
| | `-` | 二元减运算符(算术运算符),如:`3 - 2` 等 | |
| `5` | `<<` | 左移位运算符(位运算符) | ➡️(从左到右) |
| | `>>` | 右移位运算符(位运算符) | |
| `6` | `>` | 大于运算符(比较运算符) | ➡️(从左到右) |
| | `>=` | 大于等于运算符(比较运算符) | |
| | `<` | 小于运算符(比较运算符) | |
| | `<=` | 小于等于运算符(比较运算符) | |
| `7` | `==` | 等于运算符(比较运算符) | ➡️(从左到右) |
| | `!=` | 不等于运算符(比较运算符) | |
| `8` | `&` | 按位与运算符(位运算符) | ➡️(从左到右) |
| `9` | `^` | 按位异或运算符(位运算符) | ➡️(从左到右) |
| `10` | `\|` | 按位或运算符(位运算符) | ➡️(从左到右) |
| `11` | `&&` | 逻辑与运算符(逻辑运算符) | ➡️(从左到右) |
| `12` | `\|\|` | 逻辑或运算符(逻辑运算符) | ➡️(从左到右) |
| `13` | `?:` | 三目(三元)运算符 | ⬅️(从右到左) |
| `14` | `=` | 简单赋值运算符(赋值运算符) | ⬅️(从右到左) |
| | `/=` | 除后赋值运算符(赋值运算符) | |
| | `*=` | 乘后赋值运算符(赋值运算符) | |
| | `%=` | 取模后赋值运算符(赋值运算符) | |
| | `+=` | 加后赋值运算符(赋值运算符) | |
| | `-=` | 减后赋值运算符(赋值运算符) | |
| | `<<=` | 左移后赋值运算符(赋值运算符) | |
| | `>>=` | 右移后赋值运算符(赋值运算符) | |
| | `&=` | 按位与后赋值运算符(赋值运算符) | |
| | `^=` | 按位异或后赋值运算符(赋值运算符) | |
| | `\|=` | 按位或后赋值运算符(赋值运算符) | |
| `15` | `,` | 逗号运算符 | ➡️(从左到右) |
> [!WARNING]
>