C語言概述 1.什麼是C語言 C語言就是人和電腦交流的一種語言 語言是用來交流溝通的。有一方說,有另一方聽,必須有兩方參與,這是語言最重要的功能: 說的一方傳遞信息,聽的一方接收信息; 說的一方下達指令,聽的一方遵循命令做事情。 語言是人和人交流,C語言是人和機器交流。只是,人可以不聽另外一個人, ...
C語言概述
1.什麼是C語言
C語言就是人和電腦交流的一種語言
語言是用來交流溝通的。有一方說,有另一方聽,必須有兩方參與,這是語言最重要的功能:
- 說的一方傳遞信息,聽的一方接收信息;
- 說的一方下達指令,聽的一方遵循命令做事情。
語言是人和人交流,C語言是人和機器交流。只是,人可以不聽另外一個人,但是,電腦是無條件服從。
語言有獨特的語法規則和定義,雙方必須遵循這些規則和定義才能實現真正的交流。
最早的時候使用的是機器語言(01001),後面發展為彙編語言,彙編語言相對於機器語言易懂一些,彙編語言依賴於寄存器,不同的機器可能沒有寄存器。之後出現了高級語言
編譯:將高級語言轉換為電腦能夠識別的二進位指令。
2.C語言特點
2.1優點
- 代碼量小
- 執行速度快
- 功能強大
- 編程自由
2.2缺點
- 寫代碼實現周期長
- 可移植性差
- 過於自由,經驗不足易出錯
- 對平臺庫依賴較多
2.3C語言應用領域
C語言的應用極其廣泛,從網站後臺,到底層操作系統,從多媒體應用到大型網路游戲,均可使用C語言來開發:
- C語言可以寫網站後臺程式
- C語言可以專門針對某個主題寫出功能強大的程式庫
- C語言可以寫出大型游戲的引擎
- C語言可以寫出另一個語言來
- C語言可以寫操作系統和驅動程式,並且只能用C語言編寫
- 任何設備只要配置了微處理器,就都支持C語言。從微波爐到手機,都是由C語言技術來推動的
2.4C語言簡潔
C語言僅有32個關鍵字,9種控制語句,34種運算符,卻能完成無數的功能:
3.書寫第一個C語言程式
3.1 Visual Studio基礎使用
- 使用Visual studio 2019集成開發環境,先創建項目,選擇代碼文件夾
- 解決方案資源管理器管理代碼
- 創建的代碼放在項目中,在解決方案資源管理器中的源文件中創建.C文件,源文件右擊-->添加-->新建項-->選擇C++-->更改文件尾碼-->添加
書寫第一個代碼
// 預處理指令,在預編譯時處理
// #include 包含stdio.h頭文件
// stdio.h頭文件包含了一些函數
// 兩個//表示註釋
// 符號與()結合,代表一個函數
// main() main函數也稱作是主函數,整個程式中有且僅有一個main函數,程式從main函數開始執行
// int代表main函數結束之後的返回值類型,C語言中可以不寫返回值,在C++中必須要寫
// return代表結束這個函數,返回值,返回值的類型和函數定義時的返回值類型一致
// {}裡面的是函數體,所有需要執行的代碼必須寫在{}中
// 每一條代碼必須以分號(;)結尾
// printf是一個庫函數,printf()就是函數調用
#include <stdio.h>
int main()
{
printf("Hello world\n");//列印到終端
printf("Evan zhang");
return 0;
}
- 執行代碼,ctrl+F5
3.2 使用文本編輯器編寫代碼
- C代碼先編譯後執行,首先將C代碼保存,windows命令行界面下,預設是沒有gcc編譯器,我們需要配置一下環境。由於我們安裝了Qt,Qt是一個集成開發環境,內部集成gcc編譯器,配置一下環境變數即可使用gcc。
- 編譯代碼,安裝Qt之後,在Qt安裝目錄(D:\Qt\Tools\mingw1120_64\bin)下,有gcc.exe是進行編譯代碼的
- wind+R-->cmd-->打開終端,使用gcc -v查看gcc是否可用,如果找不到就說明沒有配置環境變數
- 如果想讓電腦能夠執行gcc,比如讓電腦能夠找到gcc--就是配置環境變數(配置環境變數之後要重啟終端)
windows中的幾個命令
- cls 清屏
- dir 查看當前文件夾下有哪些文件
編譯代碼
gcc 文件絕對路徑 -o 目標文件
上述方法要寫路徑,比較麻煩,可以在源代碼文件夾下打開cmd,cmd直接切換到該目錄下,這樣就不用添加路徑了
gcc 源文件 -o 編譯文件名
- 直接使用編譯後的文件進行執行代碼
4.c語言編譯步驟
C代碼編譯成可執行程式經過4步:
1)預處理:巨集定義展開、頭文件展開、條件編譯等,同時將代碼中的註釋刪除,這裡並不會檢查語法
2)編譯:檢查語法,將預處理後文件編譯生成彙編文件
3)彙編:將彙編文件生成目標文件(二進位文件)
4)鏈接:C語言寫的程式是需要依賴各種庫的,所以編譯之後還需要把庫鏈接到最終的可執行程式中去
4.1分步編譯
預處理:gcc -E hello.c -o hello.i
編 譯:gcc -S hello.i -o hello.s
匯 編:gcc -c hello.s -o hello.o
鏈 接:gcc hello.o -o hello
選項 | 含義 |
---|---|
-E | 只進行預處理 |
-S(大寫) | 只進行預處理和編譯 |
-c(小寫) | 只進行預處理、編譯和彙編 |
-o file | 指定生成的輸出文件名為 file |
文件尾碼 | 含義 |
---|---|
.c | C 語言文件 |
.i | 預處理後的 C 語言文件 |
.s | 編譯後的彙編文件 |
.o | 編譯後的目標文件 |
1. 預處理
- include可以包含任何文件,可以是.h文件,也可以包含.c文件;.h文件是頭文件
#include <stdio.h>
#include <a.c>
- 註釋在編譯完之後被刪除,註釋有兩種方法,單行註釋//,多行註釋/**/
- 預處理時會將巨集替換,將巨集用後面的表達式進行替換
- c語言每條語句都有分號,如果缺失分號,是可以進行預處理的,預處理的時候是不會檢查語法錯誤的
#include <stdio.h>
#define PI 3.14 // #define表示定義一個巨集
int main()
{
printf("Hello world %lf\n",PI);//列印到終端
printf("Evan zhang");
return 0;
}
- 條件編譯,可以用來註釋,在編譯的時候選擇性的編譯
#include <stdio.h>
#define PI 3.14 // #define表示定義一個巨集
int main()
{
#if 0 // 不成立,中間內容不進行編譯,#if 1進行編譯
printf("Hello world %lf\n",PI);//列印到終端
printf("Evan zhang");
#endif
return 0;
}
2. 編譯
將預處理文件編譯成彙編文件(.s文件),編譯會檢查語法錯誤
gcc -S hello.i -o hello.s
3. 彙編
將彙編文件轉換為二進位文件(.o)
gcc -c hello.s -o hello.o
4. 鏈接
二進位文件是執行不了的,需要進行鏈接,鏈接需要設置運行的環境比如堆和棧的空間,還有一些庫文件
gcc hello.o -o hello
5.system庫函數
作用:在程式中啟動另外一個程式
參數:待啟動程式的路徑名(有些程式在環境變數中能找到,不用加路徑)
#include <stdio.h>
#include <stdlib.h>
int main()
{
//system啟動程式,如果這個程式系統在環境變數中能找到,不用加路徑
//如果環境變數中找不到,需要加路徑
//windows路徑以\\或/進行分割
//c語言中\表示轉義字元,代表特殊含義
system("D:\\LXmusic_install\\lx-music-desktop\\lx-music-desktop.exe");
printf("Hello world\n");//列印到終端
printf("Evan zhang");
system("pause"); // pause程式的作用是等待用戶輸入任意按鍵
return 0;
}
6.CPU內部結構與寄存器(瞭解)
6.1 64位和32位系統區別
- 寄存器是CPU內部最基本的存儲單元
- CPU對外是通過匯流排(地址、控制、數據)來和外部設備交互的,匯流排的寬度是8位,同時CPU的寄存器也是8位,那麼這個CPU就叫8位CPU
- 如果匯流排是32位,寄存器也是32位的,那麼這個CPU就是32位CPU
- 有一種CPU內部的寄存器是32位的,但匯流排是16位,準32為CPU
- 所有的64位CPU相容32位的指令,32位要相容16位的指令,所以在64位的CPU上是可以識別32位的指令
- 在64位的CPU構架上運行了64位的軟體操作系統,那麼這個系統是64位
- 在64位的CPU構架上,運行了32位的軟體操作系統,那麼這個系統就是32位
- 64位的軟體不能運行在32位的CPU之上
- GPU主要用於運算浮點型數字運算
- 64位的匯流排也不會訪問到2^64次方的地址
- 寄存器就是存cpu運算所需要的數據
6.2寄存器名稱
8位 | 16位 | 32位 | 64位 |
---|---|---|---|
A | AX | EAX | RAX |
B | BX | EBX | RBX |
C | CX | ECX | RCX |
D | DX | EDX | RDX |
6.3寄存器\緩存\記憶體之間的關係
按與CPU遠近來分,離得最近的是寄存器,然後緩存(CPU緩存),最後記憶體。
CPU計算時,先預先把要用的數據從硬碟讀到記憶體,然後再把即將要用的數據讀到寄存器。於是 CPU<--->寄存器<--->記憶體,這就是它們之間的信息交換。
那為什麼有緩存呢?因為如果經常操作記憶體中的同一址地的數據,就會影響速度。於是就在寄存器與記憶體之間設置一個緩存。
因為從緩存提取的速度遠高於記憶體。當然緩存的價格肯定遠遠高於記憶體,不然的話,機器里就沒有記憶體的存在。
由此可以看出,從遠近來看:CPU〈---〉寄存器〈---> 緩存 <---> 記憶體。