天天看點

C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言

1. 什麼是C語言

語言是人和人交流,C語言就是人和計算機交流的一種語言

2. 為什麼要學習C語言

2.1 C語言特點

優點:

代碼量小

執行速度快

功能強大

程式設計自由

缺點:

寫代碼實作周期長

可移植性較差

過于自由,經驗不足易出錯

對平台庫依賴較多

2.2 學習C語言理由

C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言

2.3 C語言應用領域

C語言的應用極其廣泛,從網站背景,到底層作業系統,從多媒體應用到大型網絡遊戲,均可使用C語言來開發:

  • C語言可以寫網站背景程式
  • C語言可以專門針對某個主題寫出功能強大的程式庫
  • C語言可以寫出大型遊戲的引擎
  • C語言可以寫出另一個語言來
  • C語言可以寫作業系統和驅動程式,并且隻能用C語言編寫
  • 任何裝置隻要配置了微處理器,就都支援C語言。從微波爐到手機,都是由C語言技術來推動的
C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言

2.4 C語言的簡潔

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

C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言
C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言
C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言

2.5 學習C語言的常見困惑

C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言

3 第一個C語言程式:HelloWorld

3.1 編寫C語言代碼:hello.c

#include <stdio.h>

int main()
{
    //這是第一個C語言代碼 
    printf("hello world\n");
    return 0;
}
           

C語言的源代碼檔案是一個普通的文本檔案,但擴充名必須是.c

3.2 通過gcc編譯C代碼

3.2.1 gcc編譯器介紹

編輯器(如vi、記事本)是指我用它來寫程式的(編輯代碼),而我們寫的代碼語句,電腦是不懂的,我們需要把它轉成電腦能懂的語句,編譯器就是這樣的轉化工具。就是說,我們用編輯器編寫程式,由編譯器編譯後才可以運作!

編譯器是将易于編寫、閱讀和維護的進階計算機語言翻譯為計算機能解讀、運作的低級機器語言的程式。

gcc(GNU CompilerCollection,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(小寫) 隻進行預處理、編譯和彙編

3.2.2 Windows平台下gcc環境配置

windows指令行界面下,預設是沒有gcc編譯器,我們需要配置一下環境。由于安裝了Qt,Qt是一個內建開發環境,内部內建gcc編譯器,配置一下環境變量即可使用gcc。

參考文章:QT環境變量配置

3.2.3 Windows平台下編譯代碼

C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言
C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言

3.3 代碼分析

3.3.1 include頭檔案包含

#include的意思是頭檔案包含,#include <stdio.h>代表包含stdio.h這個頭檔案

使用C語言庫函數需要提前包含庫函數對應的頭檔案,如這裡使用了printf()函數,需要包含stdio.h頭檔案

可以通過man 3 printf檢視printf所需的頭檔案

#include< > 與 #include ""的差別:

< > 表示系統直接按系統指定的目錄檢索

"" 表示系統先在 "" 指定的路徑(沒寫路徑代表目前路徑)查找頭檔案,如果找不到,再按系統指定的目錄檢索

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

C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言

3.3.2 main函數

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

3.3.3 {} 括号,程式體和代碼塊

  • {}叫代碼塊,一個代碼塊内部可以有一條或者多條語句
  • C語言每句可執行代碼都是";"分号結尾
  • 所有的#開頭的行,都代表預編譯指令,預編譯指令行結尾是沒有分号的
  • 所有的可執行語句必須是在代碼塊裡面

3.3.4 注釋

  • //叫行注釋,注釋的内容編譯器是忽略的,注釋主要的作用是在代碼中加一些說明和解釋,這樣有利于代碼的閱讀
  • 叫塊注釋
  • 塊注釋是C語言标準的注釋方法
  • 行注釋是從C++語言借鑒過來的

3.3.5 printf函數

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

3.3.6 return語句

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

4. system函數

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;
}
           

5. C語言編譯過程

5.1 C程式編譯步驟

C代碼編譯成可執行程式經過4步:

  1. 預處理:宏定義展開、頭檔案展開、條件編譯等,同時将代碼中的注釋删除,這裡并不會檢查文法
  1. 編譯:檢查文法,将預處理後檔案編譯生成彙編檔案
  1. 彙編:将彙編檔案生成目标檔案(二進制檔案)
  1. 連結:C語言寫的程式是需要依賴各種庫的,是以編譯之後還需要把庫連結到最終的可執行程式中去
C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言

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 編譯後的目标檔案
C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言

2) 一步編譯

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

C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言

5.3 查找程式所依賴的動态庫

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

C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言
C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言

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

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〈---〉寄存器〈---> 緩存 <---> 記憶體。

C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言

7. 內建開發環境IDE

內建開發環境(IDE,IntegratedDevelopment Environment )是用于提供程式開發環境的應用程式,一般包括代碼編輯器、編譯器、調試器和圖形使用者界面工具。內建了代碼編寫功能、分析功能、編譯功能、調試功能等一體化的開發軟體服務套。所有具備這一特性的軟體或者軟體套(組)都可以叫內建開發環境。

7.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調試

7.2 Microsoft Visual Studio

Microsoft Visual Studio(簡稱VS)是美國微軟公司的開發工具包系列産品。VS是一個基本完整的開發工具集,它包括了整個軟體生命周期中所需要的大部分工具,如UML工具、代碼管控工具、內建開發環境(IDE)等等,所寫的目标代碼适用于微軟支援的所有平台。Visual Studio是目前最流行的Windows平台應用程式的內建開發環境。

1) VS常用快捷鍵

快捷鍵 含義
Ctrl + k,Ctrl + f 自動格式化代碼
Ctrl + k,Ctrl + c 注釋代碼
Ctrl + k,Ctrl + u 取消注釋代碼
F9 設定斷點
F5 調試運作
Ctrl + F5 不調試運作
Ctrl + Shift + b 編譯,不運作
F10 next調試
F11 step調試

2) VS2013的C4996錯誤

由于微軟在VS2013中不建議再使用C的傳統庫函數scanf,strcpy,sprintf等,是以直接使用這些庫函數會提示C4996錯誤:

C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言

VS建議采用帶_s的函數,如scanf_s、strcpy_s,但這些并不是标準C函數。

要想繼續使用此函數,需要在源檔案中添加以下指令就可以避免這個錯誤提示:

#define _CRT_SECURE_NO_WARNINGS     //這個宏定義最好要放到.c檔案的第一行

#pragma warning(disable:4996)    //或者使用這個
           

8. 彙編語言

8.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;//成功完成
}
           

8.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
C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言
  1. 選擇反彙編按鈕
C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言
  1. 根據彙編代碼分析程式
C語言基礎(一)—— C語言概述(領域、編譯過程、IDE)1. 什麼是C語言2. 為什麼要學習C語言3 第一個C語言程式:HelloWorld4. system函數5. C語言編譯過程6. CPU内部結構與寄存器7. 內建開發環境IDE8. 彙編語言

繼續閱讀