1. 程式人生 > 其它 >2020年度鑽石C++C學習筆記(1)《博學谷》

2020年度鑽石C++C學習筆記(1)《博學谷》

1.C語言概述

1.1 什麼是C語言

一提到語言這個詞語,自然會想到的是像英語、漢語等這樣的自然語言,因為它是人和人交換資訊不可缺少的工具。

而今天計算機遍佈了我們生活的每一個角落,除了人和人的相互交流之外,我們必須和計算機角落。

用什麼的什麼樣的方式和計算機做最直接的交流呢?人們自然想到的是最古老也最方便的方式——語言,而C語言就是人和計算機交流的一種語言。

語言是用來交流溝通的。有一方說,有另一方聽,必須有兩方參與,這是語言最重要的功能:
說的一方傳遞資訊,聽的一方接收資訊;
說的一方下達指令,聽的一方遵循命令做事情。

語言是人和人交流,C語言是人和機器交流。只是,人可以不聽另外一個人,但是,計算機是無條件服從。

語言有獨特的語法規則和定義,雙方必須遵循這些規則和定義才能實現真正的交流。

1.2 為什麼要學習C語言

1.2.1 C語言特點


1) 優點
程式碼量小
執行速度快
功能強大
程式設計自由

2) 缺點
寫程式碼實現週期長
可移植性較差
過於自由,經驗不足易出錯
對平臺庫依賴較多

1.2.2 學習C語言理由

1.2.3 C語言應用領域


C語言的應用極其廣泛,從網站後臺,到底層作業系統,從多媒體應用到大型網路遊戲,均可使用C語言來開發:
C語言可以寫網站後臺程式
C語言可以專門針對某個主題寫出功能強大的程式庫
C語言可以寫出大型遊戲的引擎
C語言可以寫出另一個語言來
C語言可以寫作業系統和驅動程式,並且只能用C語言編寫
任何裝置只要配置了微處理器,就都支援C語言。從微波爐到手機,都是由C語言技術來推動的

1.2.4 C語言的簡潔


C語言僅有32個關鍵字,9種控制語句,34種運算子,卻能完成無數的功能:

1.2.5 學習C語言的常見困惑


1.3 第一個C語言程式:HelloWorld


1.3.1 編寫C語言程式碼:hello.c


#include <stdio.h>

int main()
{
//這是第一個C語言程式碼
printf("hello world\n");
return 0;
}
C語言的原始碼檔案是一個普通的文字檔案,但副檔名必須是.c。

1.3.2 通過gcc編譯C程式碼


1) gcc編譯器介紹
編輯器(如vi、記事本)是指我用它來寫程式的(編輯程式碼),而我們寫的程式碼語句,電腦是不懂的,我們需要把它轉成電腦能懂的語句,編譯器就是這樣的轉化工具。就是說,我們用編輯器編寫程式,由編譯器編譯後才可以執行!
編譯器是將易於編寫、閱讀和維護的高階計算機語言翻譯為計算機能解讀、執行的低階機器語言的程式。
gcc(GNU Compiler Collection,GNU 編譯器套件),是由 GNU 開發的程式語言編譯器。gcc原本作為GNU作業系統的官方編譯器,現已被大多數類Unix作業系統(如Linux、BSD、Mac OS X等)採納為標準的編譯器,gcc同樣適用於微軟的Windows。

gcc最初用於編譯C語言,隨著專案的發展gcc已經成為了能夠編譯C、C++、Java、Ada、fortran、Object C、Object C++、Go語言的編譯器大家族。

編譯命令格式:
gcc [-option1] ... <filename>
g++ [-option1] ... <filename>
命令、選項和原始檔之間使用空格分隔
一行命令中可以有零個、一個或多個選項
檔名可以包含檔案的絕對路徑,也可以使用相對路徑
如果命令中不包含輸出可執行檔案的檔名,可執行檔案的檔名會自動生成一個預設名,Linux平臺為a.out,Windows平臺為a.exe

gcc、g++編譯常用選項說明:
選項 含義
-o file 指定生成的輸出檔名為file
-E 只進行預處理
-S(大寫) 只進行預處理和編譯
-c(小寫) 只進行預處理、編譯和彙編

2) Windows平臺下gcc環境配置
windows命令列介面下,預設是沒有gcc編譯器,我們需要配置一下環境。由於我們安裝了Qt,Qt是一個整合開發環境,內部整合gcc編譯器,配置一下環境變數即可使用gcc。

a)進入Qt安裝目錄:


b)拷貝gcc所在的路徑(不同安裝目錄有所差異)
C:\Qt\Qt5.5.0\Tools\mingw492_32\bin


c) 設定windows環境變數
計算機(右擊)-> 屬性:


如果是win7,雙擊Path後,把拷貝的路徑追加到後面,路徑之間需要英文” ; ”分隔:

如果是win10,介面做得友好一下,新建新增路徑即可:


d)測試gcc命令:

3) Windows平臺下編譯程式碼


1.3.3 程式碼分析


1) include標頭檔案包含
#include的意思是標頭檔案包含,#include <stdio.h>代表包含stdio.h這個標頭檔案
使用C語言庫函式需要提前包含庫函式對應的標頭檔案,如這裡使用了printf()函式,需要包含stdio.h標頭檔案
可以通過man 3 printf檢視printf所需的標頭檔案

#include< > 與 #include ""的區別:
< > 表示系統直接按系統指定的目錄檢索
"" 表示系統先在 "" 指定的路徑(沒寫路徑代表當前路徑)查詢標頭檔案,如果找不到,再按系統指定的目錄檢索

stdio.h是在作業系統的系統目錄下:


2) main函式
一個完整的C語言程式,是由一個、且只能有一個main()函式(又稱主函式,必須有)和若干個其他函式結合而成(可選)。
main函式是C語言程式的入口,程式是從main函式開始執行。

3) {} 括號,程式體和程式碼塊
{}叫程式碼塊,一個程式碼塊內部可以有一條或者多條語句
C語言每句可執行程式碼都是";"分號結尾
所有的#開頭的行,都代表預編譯指令,預編譯指令行結尾是沒有分號的
所有的可執行語句必須是在程式碼塊裡面

4) 註釋
//叫行註釋,註釋的內容編譯器是忽略的,註釋主要的作用是在程式碼中加一些說明和解釋,這樣有利於程式碼的閱讀
/**/叫塊註釋
塊註釋是C語言標準的註釋方法
行註釋是從C++語言借鑑過來的

5) printf函式
printf是C語言庫函式,功能是向標準輸出裝置輸出一個字串
printf(“hello world\n”);//\n的意思是回車換行

6) return語句
return代表函式執行完畢,返回return代表函式的終止
如果main定義的時候前面是int,那麼return後面就需要寫一個整數;如果main定義的時候前面是void,那麼return後面什麼也不需要寫
在main函式中return 0代表程式執行成功,return -1代表程式執行失敗
int main()和void main()在C語言中是一樣的,但C++只接受int main這種定義方式

1.4 system函式


1.4.1 system函式的使用


#include <stdlib.h>
int system(const char *command);
功能:在已經執行的程式中執行另外一個外部程式
引數:外部可執行程式名字
返回值:
成功:0
失敗:任意數字

示例程式碼:
#include <stdio.h>
#include <stdlib.h>

int main()
{
//system("calc"); //windows平臺
system("ls"); //Linux平臺, 需要標頭檔案#include <stdlib.h>

return 0;
}

1.5 C語言編譯過程


1.5.1 C程式編譯步驟


C程式碼編譯成可執行程式經過4步:
1)預處理:巨集定義展開、標頭檔案展開、條件編譯等,同時將程式碼中的註釋刪除,這裡並不會檢查語法
2)編譯:檢查語法,將預處理後文件編譯生成彙編檔案
3)彙編:將彙編檔案生成目標檔案(二進位制檔案)
4)連結:C語言寫的程式是需要依賴各種庫的,所以編譯之後還需要把庫連結到最終的可執行程式中去


1.5.2 gcc編譯過程


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 編譯後的目標檔案


2) 一步編譯
gcc hello.c -o demo(還是經過:預處理、編譯、彙編、連結的過程):

1.5.3 查詢程式所依賴的動態庫

Windows平臺下,需要相應軟體(Depends.exe):

1.6 CPU內部結構與暫存器(瞭解)


1.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之上

1.6.2 暫存器名字(瞭解)


8位 16位 32位 64位
A AX EAX RAX
B BX EBX RBX
C CX ECX RCX
D DX EDX RDX

1.6.3 暫存器、快取、記憶體三者關係


按與CPU遠近來分,離得最近的是暫存器,然後快取(CPU快取),最後記憶體。

CPU計算時,先預先把要用的資料從硬碟讀到記憶體,然後再把即將要用的資料讀到暫存器。於是 CPU<--->暫存器<--->記憶體,這就是它們之間的資訊交換。

那為什麼有快取呢?因為如果經常操作記憶體中的同一址地的資料,就會影響速度。於是就在暫存器與記憶體之間設定一個快取。

因為從快取提取的速度遠高於記憶體。當然快取的價格肯定遠遠高於記憶體,不然的話,機器裡就沒有記憶體的存在。

由此可以看出,從遠近來看:CPU〈---〉暫存器〈---> 快取 <---> 記憶體。

1.7 組合語言


1.7.1 VS中C語言嵌套匯編程式碼(瞭解)


#include <stdio.h>

int main()
{
//定義整型變數a, b, c
int a;
int b;
int c;

__asm
{
mov a, 3 //3的值放在a對應記憶體的位置
mov b, 4 //4的值放在b對應記憶體的位置
mov eax, a //把a記憶體的值放在eax暫存器
add eax, b //eax和b相加,結果放在eax
mov c, eax //eax的值放在c中
}

printf("%d\n", c);//把c的值輸出

return 0;//成功完成
}

1.7.2 VS反彙編


#include <stdio.h>

int main()
{
//定義整型變數a, b, c
int a;
int b;
int c;

a = 3;
b = 4;
c = a + b;

printf("%d\n", c);//把c的值輸出

return 0;//成功完成
}

1)設定斷點F9


2)選擇反彙編按鈕

3)根據彙編程式碼分析程式


1.8 整合開發環境IDE


整合開發環境(IDE,Integrated Development Environment )是用於提供程式開發環境的應用程式,一般包括程式碼編輯器、編譯器、偵錯程式和圖形使用者介面工具。集成了程式碼編寫功能、分析功能、編譯功能、除錯功能等一體化的開發軟體服務套。所有具備這一特性的軟體或者軟體套(組)都可以叫整合開發環境。

1.8.1 Qt Creator


Qt Creator是跨平臺的 Qt IDE, Qt Creator 是 Qt 被 Nokia 收購後推出的一款新的輕量級整合開發環境(IDE)。此 IDE 能夠跨平臺執行,支援的系統包括 Linux(32 位及 64 位)、Mac OS X 以及 Windows。根據官方描述,Qt Creator 的設計目標是使開發人員能夠利用 Qt 這個應用程式框架更加快速及輕易的完成開發任務。

快捷鍵 含義
Ctrl + i 自動格式化程式碼
Ctrl + / 註釋/取消註釋
Alt + Enter 自動完成類函式定義
F4 .h 檔案和對應.cpp 檔案切換
F9 設定斷點
F5 除錯執行
Ctrl + r 編譯,但不除錯執行
Ctrl + b 編譯,不執行
F10 next除錯
F11 step除錯