初識C語言之基本編程思想與基本概念掃盲
前言:C語言是包含了很多編程的基本思想,理解C能夠有助於理解其他高級語言,深刻理解編程很多基本思想;這對新手入門是有很多好處的,正所謂磨刀不誤砍柴工,內功與基礎修煉紮實了,才能開始蓋高樓大廈。 這篇文字作為讀書筆記摘錄了C Primer Plus這本經典C語言的內容,便於知識復習與分享。推薦書籍《C Primer Plus》
第1章 初識C語言
1.1 C語言的起源
為程序員設計開發的語言,有用的語言,程序員使用的一種編程工具。
1.2 選擇C語言的理由
設計特性:自頂向下的規劃、結構化編程、模塊化設計;
高效性:運行速度快,微調控能力(匯編語言才具有的能力);
可移植性:許多計算機體系結構都可以用C
強大而靈活:
C編譯器的作用:就是把C語言代碼轉換成計算機內部指令的程序。
可移植性:不同的硬件,使用不同的機器語言,由於架構體系的不同。
匯編語言:是為特殊的中央處理單元CPU,設計的一系列內部指令,使用助記符表示。
面向程序員:許多任務用C來處理都非常簡潔,但是反面就是會容易犯莫名其妙的錯誤;
缺點:自由,但是必須承擔更多的責任;自由就必須時刻保持警惕;大量運算符,可以編寫出讓人費解的代碼;
1.3 C語言的應用範圍
小型計算機(UNIX系統)、微型計算機(PC)、大型機(龐然大物);
C語言修改方便,移植到新型號的計算機中也沒什麽問題。
C++是C的超集,C++
面向對象編程是一門哲學!通過對語言的建模來適應問題,而不是對問題建模來適應語言。
嵌入式編程的流行語言:許多現代化設備的微處理器上
最重要的編程語言之一!
1.4 計算機能做什麽
了解計算機的工作原理!
C語言編寫程序與運行程序時發生的事情之間有什麽聯系?
計算機的組成:1、中央處理單元(CPU)承擔大部分運算工作;2、隨機存取內存(RAM)是存儲程序和文件的工作區;3、永久內存存儲設備(機械硬盤、固態硬盤);4、各種外圍設備(鍵盤、鼠標、顯示器等等);
CPU的工作過程:來概括就是,能夠以驚人的速度從事枯燥的工作!工作過程簡單來講就是,從內存中獲取一條指令並執行,然後再從內存中獲取下一條指令並執行。CPU有自己的小工作區,由若幹個寄存器構成。每個寄存器都可以存儲一個數字。CPU能夠理解的指令非常有限(這些指令的集合叫作指令集)。這些指令都相當具體。
有趣的知識:
-
存儲在計算機中所有內容都是數字。計算機以數字的形式存儲數字和字符(每個字符都有一個數字碼),計算機載入寄存器中的指令也是以數字形式存儲的。
-
計算機程序最終必須以數字指令碼(機器語言)來表示。
計算機的工作原理就是,希望計算機做某事,就必須為其提供特殊的指令列表(程序
),必須用計算機能直接明白的語言創建程序。這是一項繁瑣、乏味、費力的任務。
1.5 高級計算機語言和編譯器
高級編程語言以多種方式簡化了編程工作。首先,不必用數字碼表示指令;其次,使用的指令更貼近你如何想這個問題,可以在更抽象的層次表達你的想法。
但是對計算機而言,高級指令就是一堆無法理解的無用數據。編譯器在這個時候排上了用場。編譯器是把高級語言程序翻譯成計算機理解的機器語言指令集的程序。
程序員進行高級思維活動,編譯器負責處理冗長乏味的細節工作。
不同CPU制造商使用的指令系統和編碼格式不同。使用合適的編譯器和編譯器集,便可把一種高級語言程序轉換成供不同類型CPU使用的機器語言程序。
高級語言以更抽象的方式描述行為,不受限與特定的CPU或指令集。高級語言簡單易學,用高級語言編程比用機器語言編程容易得多。
1.6 語言標準
1.7 使用C語言的7個步驟
編程的7個步驟:1、定義程序的目標;2、設計程序;3、編寫代碼;4、編譯;5、運行程序;6、測試和調試程序;7、維護和修改程序;
-
定義程序的目標:明確自己想做什麽,需要哪些信息,要進行哪些計算和控制,程序要報告什麽信息。這個過程不涉及具體的計算機語言,應該用一般術語來描述問題。
-
設計程序:對程序應該完成什麽任務有概念性的認知後,應該思考如何用程序來完成它。用戶界面應該是什麽樣的?如何組織程序?目標用戶是誰?準備花多長時間來完成這個程序?如何表示數據,用什麽方法處理數據,用一個合適的方式表示信息可以更容易地設計程序和處理數據。再次強調用一般術語來描述問題,而不是用具體代碼。
-
編寫代碼:這個過程是真正使用C語言的地方,而且取決於編程環境。文本編輯器創建源代碼文件,使用C的註釋工具在源代碼中加入對代碼的解釋。
-
編譯:編譯的細節取決於編程的環境。從概念的角度,講解編譯發生了什麽事情。編譯把源代碼轉換成可執行代碼的程序。可執行代碼是用計算機的機器語言表示的代碼。不同的計算機使用不同的機器語言方案。編譯器還會檢查C語言程序是否有效。如果發現錯誤就不生成可執行文件並且報錯,並生成錯誤信息或警告信息。
-
運行程序:
-
測試和調試程序:查找和修復程序錯誤的過程叫調試。
-
維護和修改代碼
說明:養成先規劃再動手編寫代碼的好習慣,用筆和紙記錄下程序的目標和設計框架。這樣在編寫代碼的過程中會更加得心應手、條例清晰。
1.8 編程機制源代碼文件 目標代碼(中間代碼)-->目標代碼文件,目標文件、中間文件 啟動代碼--> 庫函數(目標代碼)-->庫文件 -->
C語言編寫程序時,編寫的內容被儲存在文本文件中,該文件被稱為源代碼文件(source code file),源代碼文件以.c結尾。基本名.擴展名->這樣的組合就是文件名。
C編程的基本策略是,用程序把源代碼文件轉換為可執行文件(可直接運行的機器語言代碼)。C實現通過編譯和鏈接兩個步驟來完成這個過程。分而治之的方法方便對程序進行模塊化。
過程:編譯器把源代碼轉換成中間代碼,鏈接器把中間代碼和其他代碼合並,生成可執行文件。可以獨立編譯單獨模塊,稍後再用鏈接器合並已編譯的模塊。如果只更改某個模塊,不必因此重新編譯其他模塊。鏈接器還可以將已經編寫的程序和預編譯的庫代碼合並。
中間文件有多種形式。這裏描述的是最普遍的一種形式,即把源代碼轉換為機器語言代碼,並把結果放在目標代碼文件中。目標文件(目標代碼文件)存儲的是編譯器翻譯的源代碼,雖然目標文件中包含了機器語言代碼,但並不能直接運行該文件,這還不是完整的程序。
目標代碼文件缺乏啟動代碼。啟動代碼充當著程序和操作系統之間的接口。啟動代碼由於操作系統的不同而不同。
而且目標代碼還缺少庫函數。幾乎所有的C程序都要使用C標準庫中的函數。這些庫函數真正的代碼被存儲在一個稱為庫的文件中。庫文件中有許多函數的目標代碼。
目標文件和可執行文件都是由機器語言指令組成的。目標文件只包含編譯器為你編寫的代碼翻譯的機器語言代碼,可執行文件中還包含你編寫的程序中使用的庫函數和啟動代碼的機器代碼。
有些系統中,編譯器會自動啟動鏈接器。用戶只需要給出編譯命令即可。
有些系統中,必須分別運行編譯程序和鏈接程序。
1.8.1 Unix系統
可執行文件的擴展名.out
編譯命令是cc
編譯器會創建一個與源代碼基本名相同的目標代碼文件,擴展名是.o
但是一旦鏈接器生成了完整的可執行文件,就會刪除.o目標代碼文件。
如果原始程序有多個源代碼文件,則保留目標代碼文件。後面學到多文件程序時,這樣做的好處你就會明白。
1.8.2 GNU編譯器集合和LLVM項目
GNU項目始於1987年是一個開發大量免費UNIX軟件的集合(GNU的意思是GNU’s Not UNIX,即GNU不是UNIX)。
GNU編譯器集合->即GCC,其中包含 GCC C編譯器是該項目的產品之一。
GCC有各種版本以適應不同硬件平臺和操作系統。用gcc命令便可以調用GCC C編譯器。許多使用gcc的系統都用cc作為gcc的別名。
LLVM 項目是與編譯器相關的開源軟件的集合。
各系統都使用cc別名來代替gcc或clang命令。
1.8.3 Linux系統
Linux是一個開源、流行、類似於UNIX操作系統,可在不同平臺上(PC、MAC)上運行。準備C程序是,要使用GNU提供的GCC 公共域C編譯器。
安裝Linux時,可選擇是否安裝GCC,如果之前沒有安裝GCC,則必須安裝。安裝過程中會將cc作為gcc的別名。在命令行中使用cc來代替gcc。
1.8.4 PC的命令行編譯器
C編譯器不是標準Windows軟件包的一部分,因此需要從別處獲取並安裝C編譯器。可以從網上免費下載Cygwin和MinGW。這樣可以再PC上通過命令行使用GCC編譯器。
1.8.5 集成開發環境(Windows)
利用集成開發環境IDE可以快速開發C程序。IDE都內置了用於編寫C程序的編輯器。
初次接觸IDE環境可能令人望而生畏,因為它提供多個目標(target),即運行程序的多種環境。例如IDE提供了32位Windows程序,64位Windows程序,動態鏈接庫DLL等。許多目標都涉及Windows圖形界面。要管理這些選擇,通常要先創建一個項目(project),以便稍後在其中添加待使用的源代碼文件名。
1.9 小結
C是強大而簡潔的編程語言。C語言更容易從一個系統移植到另一個系統。
C是編譯型語言。C編譯器和鏈接器把C語言源代碼轉換成可執行代碼的程序。
初識C語言之基本編程思想與基本概念掃盲