主頁 > 後端開發 > python基礎之vi—終端中的編輯器

python基礎之vi—終端中的編輯器

2020-09-17 03:19:32 後端開發

# `vi` —— 終端中的編輯器

## 目標

* `vi` 簡介
* 打開和新建檔案
* 三種作業模式
* 常用命令
* 分屏命令
* 常用命令速查圖

## 01. `vi` 簡介

### 1.1 學習 `vi` 的目的

* 在作業中,要對 **服務器** 上的檔案進行 **簡單** 的修改,可以使用 `ssh` 遠程登錄到服務器上,并且使用 `vi` 進行快速的編輯即可
* 常見需要修改的檔案包括:
* **源程式**
* **組態檔**,例如 `ssh` 的組態檔 `~/.ssh/config`

> * 在沒有圖形界面的環境下,要編輯檔案,`vi` 是最佳選擇!
> * 每一個要使用 Linux 的程式員,都應該或多或少的學習一些 `vi` 的常用命令

### 1.2 vi 和 vim

* 在很多 `Linux` 發行版中,直接把 `vi` 做成 `vim` 的軟連接

#### vi

* `vi` 是 `Visual interface` 的簡稱,是 `Linux` 中 **最經典** 的文本編輯器
* `vi` 的核心設計思想 —— **讓程式員的手指始終保持在鍵盤的核心區域,就能完成所有的編輯操作**
![\[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KXTTSvCH-1596876287357)(media/14993340485745/001_vi%E9%94%AE%E7%9B%98.png)\]](https://img-blog.csdnimg.cn/20200808164852558.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW8xMjk5MDAyNzg4,size_16,color_FFFFFF,t_70)


* `vi` 的特點:
* **沒有圖形界面** 的 **功能強大** 的編輯器
* 只能是編輯 **文本內容**,不能對字體、段落進行排版
* **不支持滑鼠操作**
* **沒有選單**
* **只有命令**
* `vi` 編輯器在 **系統管理**、**服務器管理** 編輯檔案時,**其功能永遠不是圖形界面的編輯器能比擬的**

#### `vim`

**vim = vi improved**

* `vim` 是從 `vi` 發展出來的一個文本編輯器,支持 **代碼補全**、**編譯** 及 **錯誤跳轉** 等方便編程的功能特別豐富,在程式員中被廣泛使用,被稱為 **編輯器之神**

#### 查詢軟連接命令(知道)

* 在很多 `Linux` 發行版中直接把 `vi` 做成 `vim` 的軟連接

```bash
# 查找 vi 的運行檔案

$ which vi
$ ls -l /usr/bin/vi
$ ls -l /etc/alternatives/vi
$ ls -l /usr/bin/vim.basic

# 查找 vim 的運行檔案
$ which vim
$ ls -l /usr/bin/vim
$ ls -l /etc/alternatives/vim
$ ls -l /usr/bin/vim.basic
```

## 02. 打開和新建檔案

* 在終端中輸入 `vi` **在后面跟上檔案名** 即可

```bash
$ vi 檔案名
```

* 如果檔案已經存在,會直接打開該檔案
* 如果檔案不存在,會新建一個檔案

### 2.1 打開檔案并且定位行

* 在日常作業中,有可能會遇到 **打開一個檔案,并定位到指定行** 的情況
* 例如:在開發時,**知道某一行代碼有錯誤**,可以 **快速定位** 到出錯代碼的位置

* 這個時候,可以使用以下命令打開檔案

```bash
$ vi 檔案名 +行數
```

> 提示:如果只帶上 `+` 而不指定行號,會直接定位到檔案末尾

### 2.2 例外處理

* 如果 `vi` 例外退出,在磁盤上可能會保存有 **交換檔案**
* 下次再使用 `vi` 編輯該檔案時,會看到以下螢屏資訊,按下字母 `d` 可以 **洗掉交換檔案** 即可

> 提示:按下鍵盤時,注意關閉輸入法
![\[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-s0BrURZj-1596876287364)(media/14993340485745/002_%E5%88%A0%E9%99%A4%E4%BA%A4%E6%8D%A2%E6%96%87%E4%BB%B6.png)\]](https://img-blog.csdnimg.cn/20200808164934833.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW8xMjk5MDAyNzg4,size_16,color_FFFFFF,t_70)


## 03. 三種作業模式

* `vi` 有三種基本作業模式:

1. **命令模式**
* **打開檔案首先進入命令模式**,是使用 `vi` 的 **入口**
* 通過 **命令** 對檔案進行常規的編輯操作,例如:**定位**、**翻頁**、**復制**、**粘貼**、**洗掉**……
* 在其他圖形編輯器下,通過 **快捷鍵** 或者 **滑鼠** 實作的操作,都在 **命令模式** 下實作
2. **末行模式** —— 執行 **保存**、**退出** 等操作
* 要退出 `vi` 回傳到控制臺,需要在末行模式下輸入命令
* **末行模式** 是 `vi` 的 **出口**
3. **編輯模式** —— 正常的編輯文字

![\[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Wqgcc4LM-1596876287367)(media/14993340485745/003_vi%E7%9A%84%E6%A8%A1%E5%BC%8F.png)\]](https://img-blog.csdnimg.cn/20200808165039581.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW8xMjk5MDAyNzg4,size_16,color_FFFFFF,t_70)


> 提示:在 `Touch Bar` 的 Mac 電腦上 ,按 `ESC` 不方便,可以使用 `CTRL + [` 替代

### 末行模式命令

| 命令 | 英文 | 功能 |
| :---: | :---: | --- |
| w | write | 保存 |
| q | quit | 退出,如果沒有保存,不允許退出 |
| q! | quit | 強行退出,不保存退出 |
| wq | write & quit | 保存并退出 |
| x | | 保存并退出 |

## 04. 常用命令

### 命令線路圖

0. 重復次數
* 在命令模式下,**先輸入一個數字**,**再跟上一個命令**,可以讓該命令 **重復執行指定次數**
1. 移動和選擇(**多練**)
* `vi` 之所以快,關鍵在于 **能夠快速定位到要編輯的代碼行**
* **移動命令** 能夠 和 **編輯操作** 命令 **組合使用**
2. 編輯操作
* **洗掉**、**復制**、**粘貼**、**替換**、**縮排**
3. 撤銷和重復
4. 查找替換
5. 編輯

#### 學習提示

1. `vi` 的命令較多,**不要期望一下子全部記住**,個別命令忘記了,只是會影響編輯速度而已
2. 在使用 `vi` 命令時,注意 **關閉中文輸入法**

### 4.1 移動(基本)

* 要熟練使用 `vi`,首先應該學會怎么在 **命令模式** 下樣快速移動游標
* **編輯操作命令**,能夠和 **移動命令** 結合在一起使用

#### 1) 上、下、左、右

| 命令 | 功能 | 手指 |
| :---: | --- | :---: |
| h | 向左 | 食指 |
| j | 向下 | 食指 |
| k | 向上 | 中指 |
| l | 向右 | 無名指 |

![\[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-u5ATbgrh-1596876287370)(media/14993340485745/005_%E7%A7%BB%E5%8A%A8%E5%85%89%E6%A0%87.png)\]](https://img-blog.csdnimg.cn/20200808165135449.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW8xMjk5MDAyNzg4,size_16,color_FFFFFF,t_70)


#### 2) 行內移動

| 命令 | 英文 | 功能 |
| :---: | :---: | --- |
| w | word | 向后移動一個單詞 |
| b | back | 向前移動一個單詞 |
| 0 | | 行首 |
| ^ | | 行首,第一個不是空白字符的位置 |
| $ | | 行尾 |

#### 3) 行數移動

| 命令 | 英文 | 功能 |
| :---: | :---: | --- |
| gg | go | 檔案頂部 |
| G | go | 檔案末尾 |
| 數字gg | go | 移動到 數字 對應行數 |
| 數字G | go | 移動到 數字 對應行數 |
| :數字 | | 移動到 數字 對應行數 |

#### 4) 螢屏移動

| 命令 | 英文 | 功能 |
| :---: | :---: | --- |
| Ctrl + b | back | 向上翻頁 |
| Ctrl + f | forward | 向下翻頁 |
| H | Head | 螢屏頂部 |
| M | Middle | 螢屏中間 |
| L | Low | 螢屏底部 |

### 4.2 移動(程式)

#### 1) 段落移動

* `vi` 中使用 空行 來區分段落
* 在程式開發時,通常 **一段功能相關的代碼會寫在一起** —— 之間沒有空行

| 命令 | 功能 |
| :---: | --- |
| { | 上一段 |
| } | 下一段 |

#### 2) 括號切換

* 在程式世界中,`()`、`[]`、`{}` 使用頻率很高,而且 **都是成對出現的**

| 命令 | 功能 |
| :---: | --- |
| % | 括號匹配及切換 |

#### 3) 標記

* 在開發時,某一塊代碼可能**需要稍后處理**,例如:編輯、查看
* 此時先使用 `m` 增加一個標記,這樣可以 **在需要時快速地跳轉回來** 或者 **執行其他編輯操作**
* **標記名稱** 可以是 `a~z` 或者 `A~Z` 之間的任意 **一個** 字母
* 添加了標記的 **行如果被洗掉**,**標記同時被洗掉**
* 如果 **在其他行添加了相同名稱的標記**,**之前添加的標記也會被替換掉**

| 命令 | 英文 | 功能 |
| :---: | :---: | --- |
| mx | mark | 添加標記 x,x 是 a~z 或者 A~Z 之間的任意一個字母 |
| 'x | | 直接定位到標記 x 所在位置 |

### 4.3 選中文本(可視模式)

* 學習 `復制` 命令前,應該先學會 **怎么樣選中 要復制的代碼**
* 在 `vi` 中要選擇文本,需要先使用 `Visual` 命令切換到 **可視模式**
* `vi` 中提供了 **三種** 可視模式,可以方便程式員選擇 **選中文本的方式**
* 按 `ESC` 可以放棄選中,回傳到 **命令模式**

| 命令 | 模式 | 功能 |
| :---: | --- | --- |
| v | 可視模式 | 從游標位置開始按照正常模式選擇文本 |
| V | 可視行模式 | 選中游標經過的完整行 |
| Ctrl + v | 可視塊模式 | 垂直方向選中文本 |

* **可視模式**下,可以和 **移動命令** 連用,例如:`ggVG` 能夠選中所有內容

### 4.4 撤銷和恢復撤銷

* 在學習編輯命令之前,先要知道怎樣撤銷之前一次 **錯誤的** 編輯動作!

| 命令 | 英文 | 功能 |
| :---: | :---: | --- |
| u | undo | 撤銷上次命令 |
| CTRL + r | redo | 恢復撤銷的命令 |

### 4.5 洗掉文本

| 命令 | 英文 | 功能 |
| :---: | :---: | --- |
| x | cut | 洗掉游標所在字符,或者選中文字 |
| d(移動命令) | delete | 洗掉移動命令對應的內容 |
| dd | delete | 洗掉游標所在行,可以 ndd 復制多行 |
| D | delete | 洗掉至行尾 |

> 提示:如果使用 **可視模式** 已經選中了一段文本,那么無論使用 `d` 還是 `x`,都可以洗掉選中文本

* 洗掉命令可以和 **移動命令** 連用,以下是常見的組合命令:

```
* dw # 從游標位置洗掉到單詞末尾
* d0 # 從游標位置洗掉到一行的起始位置
* d} # 從游標位置洗掉到段落結尾
* ndd # 從游標位置向下連續洗掉 n 行
* d代碼行G # 從游標所在行 洗掉到 指定代碼行 之間的所有代碼
* d'a # 從游標所在行 洗掉到 標記a 之間的所有代碼
```

### 4.6 復制、粘貼

* `vi` 中提供有一個 **被復制文本的緩沖區**
* **復制** 命令會將選中的文字保存在緩沖區
* **洗掉** 命令洗掉的文字會被保存在緩沖區
* 在需要的位置,使用 **粘貼** 命令可以將緩沖區的文字插入到游標所在位置

| 命令 | 英文 | 功能 |
| :---: | :---: | --- |
| y(移動命令) | copy | 復制 |
| yy | copy | 復制一行,可以 nyy 復制多行 |
| p | paste | 粘貼 |

**提示**

* 命令 `d`、`x` 類似于圖形界面的 **剪切操作** —— `CTRL + X`
* 命令 `y` 類似于圖形界面的 **復制操作** —— `CTRL + C`
* 命令 `p` 類似于圖形界面的 **粘貼操作** —— `CTRL + V`
* `vi` 中的 **文本緩沖區同樣只有一個**,如果后續做過 **復制、剪切** 操作,之前緩沖區中的內容會被替換

**注意**

* `vi` 中的 **文本緩沖區** 和系統的 **剪貼板** 不是同一個
* 所以在其他軟體中使用 `CTRL + C` 復制的內容,不能在 `vi` 中通過 `P` 命令粘貼
* 可以在 **編輯模式** 下使用 **滑鼠右鍵粘貼**

### 4.7 替換

| 命令 | 英文 | 功能 | 作業模式 |
| :---: | :---: | --- | --- |
| r | replace | 替換當前字符 | 命令模式 |
| R | replace | 替換當前行游標后的字符 | 替換模式 |

* `R` 命令可以進入 **替換模式**,替換完成后,按下 `ESC` 可以回到 **命令模式**
* **替換命令** 的作用就是不用進入 **編輯模式**,對檔案進行 **輕量級的修改**

### 4.8 縮排和重復執行

| 命令 | 功能 |
| :---: | --- |
| >> | 向右增加縮進 |
| << | 向左減少縮進 |
| . | 重復上次命令 |

* **縮排命令** 在開發程式時,**統一增加代碼的縮進** 比較有用!
* 一次性 **在選中代碼前增加 4 個空格**,就叫做 **增加縮進**
* 一次性 **在選中代碼前洗掉 4 個空格**,就叫做 **減少縮進**
* 在 **可視模式** 下,縮排命令只需要使用 **一個** `>` 或者 `<`

> 在程式中,**縮進** 通常用來表示代碼的歸屬關系
>
> * 前面空格越少,代碼的級別越高
> * 前面空格越多,代碼的級別越低

### 4.9 查找

#### 常規查找

| 命令 | 功能 |
| :---: | --- |
| /str | 查找 str |

* 查找到指定內容之后,使用 `Next` 查找下一個出現的位置:
* `n`: 查找下一個
* `N`: 查找上一個
* 如果不想看到高亮顯示,可以隨便查找一個檔案中不存在的內容即可

#### 單詞快速匹配

| 命令 | 功能 |
| :---: | --- |
| * | 向后查找當前游標所在單詞 |
| # | 向前查找當前游標所在單詞 |

* 在開發中,通過單詞快速匹配,可以快速看到這個單詞在其他什么位置使用過

### 4.10 查找并替換

* 在 `vi` 中查找和替換命令需要在 **末行模式** 下執行
* 記憶命令格式:

```
:%s///g
```

#### 1) 全域替換

* **一次性**替換檔案中的 **所有出現的舊文本**
* 命令格式如下:

```
:%s/舊文本/新文本/g
```

#### 2) 可視區域替換

* **先選中** 要替換文字的 **范圍**
* 命令格式如下:

```
:s/舊文本/新文本/g
```

#### 3) 確認替換

* 如果把末尾的 `g` 改成 `gc` 在替換的時候,會有提示!**推薦使用!**

```
:%s/舊文本/新文本/gc
```

1. `y` - `yes` 替換
2. `n` - `no` 不替換
3. `a` - `all` 替換所有
4. `q` - `quit` 退出替換
5. `l` - `last` 最后一個,并把游標移動到行首
6. `^E` 向下滾屏
7. `^Y` 向上滾屏

### 4.11 插入命令

* 在 `vi` 中除了常用的 `i` 進入 **編輯模式** 外,還提供了以下命令同樣可以進入編輯模式:

| 命令 | 英文 | 功能 | 常用 |
| :---: | :---: | --- | :---: |
| i | insert | 在當前字符前插入文本 | 常用 |
| I | insert | 在行首插入文本 | 較常用 |
| a | append | 在當前字符后添加文本 | |
| A | append | 在行末添加文本 | 較常用 |
| o | | 在當前行后面插入一空行 | 常用 |
| O | | 在當前行前面插入一空行 | 常用 |

![\[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-U3PJ964n-1596876287373)(media/14993340485745/004_%E6%8F%92%E5%85%A5%E5%91%BD%E4%BB%A4.png)\]](https://img-blog.csdnimg.cn/20200808165230114.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW8xMjk5MDAyNzg4,size_16,color_FFFFFF,t_70)


#### 演練 1 —— 編輯命令和數字連用

* 在開發中,可能會遇到連續輸入 `N` 個同樣的字符

> 在 `Python` 中有簡單的方法,但是其他語言中通常需要自己輸入

* 例如:`**********` 連續 10 個星號

要實作這個效果可以在 **命令模式** 下

1. 輸入 `10`,表示要重復 10 次
2. 輸入 `i` 進入 **編輯模式**
3. 輸入 `*` 也就是重復的文字
4. 按下 `ESC` 回傳到 **命令模式**,回傳之后 `vi` 就會把第 `2、3` 兩步的操作重復 `10` 次

> 提示:正常開發時,在 **進入編輯模式之前,不要按數字**

#### 演練 2 —— 利用 可視塊 給多行代碼增加注釋

* 在開發中,可能會遇到一次性給多行代碼 **增加注釋** 的情況

> 在 `Python` 中,要給代碼增加注釋,可以在代碼前增加一個 `# `

要實作這個效果可以在 **命令模式** 下

1. 移動到要添加注釋的 **第 1 行代碼**,按 `^` 來到行首
2. 按 `CTRL + v` 進入 **可視塊** 模式
3. 使用 `j` 向下連續選中要添加的代碼行
4. 輸入 `I` 進入 **編輯模式**,并在 **行首插入**,注意:一定要使用 **I**
5. 輸入 `# ` 也就是注釋符號
6. 按下 `ESC` 回傳到 **命令模式**,回傳之后 `vi` 會在之前選中的每一行代碼 **前** 插入 `# `

## 05. 分屏命令

* 屬于 `vi` 的高級命令 —— 可以 **同時編輯和查看多個檔案**

### 5.1 末行命令擴展

**末行命令** 主要是針對檔案進行操作的:**保存**、**退出**、**保存&退出**、**搜索&替換**、**另存**、**新建**、**瀏覽檔案**

| 命令 | 英文 | 功能 |
| :---: | :---: | --- |
| :e . | edit | 會打開內置的檔案瀏覽器,瀏覽要當前目錄下的檔案 |
| :n 檔案名 | new | 新建檔案 |
| :w 檔案名 | write | 另存為,但是仍然編輯當前檔案,并不會切換檔案 |

> 提示:切換檔案之前,必須保證當前這個檔案已經被保存!

* 已經學習過的 **末行命令**:

| 命令 | 英文 | 功能 |
| :---: | :---: | --- |
| :w | write | 保存 |
| :q | quit | 退出,如果沒有保存,不允許退出 |
| :q! | quit | 強行退出,不保存退出 |
| :wq | write & quit | 保存并退出 |
| :x | | 保存并退出 |
| :%s///gc | | 確認搜索并替換 |

> 在實際開發中,可以使用 `w` 命令 **階段性的備份代碼**

### 5.2 分屏命令

* 使用 **分屏命令**,可以 **同時編輯和查看多個檔案**

| 命令 | 英文 | 功能 |
| :---: | :---: | --- |
| :sp [檔案名] | split | 橫向增加分屏 |
| :vsp [檔案名] | vertical split | 縱向增加分屏 |

#### 1) 切換分屏視窗

> 分屏視窗都是基于 `CTRL + W` 這個快捷鍵的,`w` 對應的英文單詞是 `window`

| 命令 | 英文 | 功能 |
| :---: | :---: | --- |
| w | window | 切換到下一個視窗 |
| r | reverse | 互換視窗 |
| c | close | 關閉當前視窗,但是不能關閉最后一個視窗 |
| q | quit | 退出當前視窗,如果是最后一個視窗,則關閉 vi |
| o | other | 關閉其他視窗 |

#### 2) 調整視窗大小

> 分屏視窗都是基于 `CTRL + W` 這個快捷鍵的,`w` 對應的英文單詞是 `window`

| 命令 | 英文 | 功能 |
| :---: | :---: | --- |
| + | | 增加視窗高度 |
| - | | 減少視窗高度 |
| > | | 增加視窗寬度 |
| < | | 減少視窗寬度 |
| = | | 等分視窗大小 |

> 調整視窗寬高的命令可以和數字連用,例如:`5 CTRL + W +` 連續 5 次增加高度

## 06. 常用命令速查圖
![\[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-pmGz9Yeg-1596876287375)(media/14993340485745/vim.png)\]](https://img-blog.csdnimg.cn/20200808165305220.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW8xMjk5MDAyNzg4,size_16,color_FFFFFF,t_70)


### vimrc

* `vimrc` 是 `vim` 的組態檔,可以設定 vim 的配置,包括:**熱鍵**、**配色**、**語法高亮**、**插件** 等
* `Linux` 中 `vimrc` 有兩個位置,**家目錄下的組態檔優先級更高**

```
/etc/vim/vimrc
~/.vimrc
```

* 常用的插件有:
* 代碼補全
* 代碼折疊
* 搜索
* Git 集成
* ……
* 網上有很多高手已經配置好的針對 `python` 開發的 `vimrc` 檔案,可以下載過來直接使用,或者等大家多 `Linux` 比較熟悉后,再行學習!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/61873.html

標籤:Python

上一篇:python---rsa加密根據指數和模生成加密引數模板--有填充

下一篇:python來爬取煎蛋網隨手拍小姐姐圖片

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more