「C語言C++編程入門」——編譯機制和語言標準

2020-09-09 虎牙教編程

編程機制

編寫程序時必須遵循確切步驟主要是取決於你的計算機環境。因為 C語言是可以移植的,所以它在許多環境中可用,其中包括 UNIX,Linux,Windows等等 。

不過,讓我們首先來看一看許多環境所共有的一些方面。你完全不必知道運行一個 C 程序後面的事情,但了解一點是一個很好的背景知識。它還可以幫助你理解為什麼編寫一個 C 程序必須經過一些特定步驟。

用 C 語言編寫一個程序時,你將編寫的內容保存在一個被稱為原始碼文件的文本文件中。大多數 的系統,都需要該文件的名稱以 .c 結尾。

例如,hello world.c 。名稱中小點前的部分被稱為基本名,小點後的部分被稱為擴展名。因此,hello world是一個基本名,c 是一個擴展名。組合在一起的 hello world.c是文件名。

這樣,在我們提到名稱時內容就可以更具體,我們假定有一個名為 helloworld.c的源文件,其原始碼如下面所示。

------------------------------------------------------

34;hello world! ");

return 0;

}

------------------------------------------------------


目標代碼文件、可執行文件和庫

C語言編程的基本策略是使用程序將原始碼文件轉換為可執行文件,此文件包含可以運行機器語言代碼。

它分兩步完成這一工作:編譯和連結。編譯器將原始碼轉換為中間代碼,連結器將此中間代碼與其他代碼相結合生成可執行文件。

C 使用被劃分為兩部分的這一方法使程序便於模塊化。你可分別編譯各個模塊,然後使用連結器將編譯過的模塊結合起來。這樣,如果需要改變一個模塊,則不必重新編譯所有其他的模塊。同時,連結器將你的程序與預編譯的庫代碼結合起來。

中間文件的形式有多種選擇。最一般的選擇,同時也是我們這裡講述的實現方式所採取的選擇,是將原始碼轉換為機器語言代碼,將結果放置在一個目標代碼文件中。雖然目標文件包含機器語言代碼,但該文件還不能運行。目標文件包含原始碼的轉換結果,但它還不是一個完整的程序。

目標代碼文件中所缺少的第一個元素是一種叫做啟動代碼(start-up code)的東西,此代碼相當於你的程序和作業系統之間的接口。

例如,你可以在DOS或Linux下運行一個 IBM PC兼容機,在兩種情況中硬體是相同的,所以會使用同樣的目標代碼,但DOS與Linux要使用不同的啟動代碼,因為這兩種系統處理程序的方式是不同的。

所缺少的第二個元素是庫例程的代碼。幾乎所有C程序都利用標準C庫中所包含的例程(稱為函數)。例如,前面的 concrete.c 使用了函數 printf()。目標代碼文件不包含這一函數的代碼,它只包含聲明使用 printf()函數的指令。實際代碼存儲在另一個稱為「庫」的文件中。庫文件中包含許多函數的目標代碼。

連結器的作用是將【目標代碼】、【系統的標準啟動代碼】和【庫代碼】這3個元素結合在一起,並將它們存放在單個文件,即可執行文件中。對庫代碼來說,連結器只從庫中提取你所使用的函數所需要的代碼,如下圖中的簡單示例:

簡而言之,目標文件和可執行文件都是由機器語言指令組成的。但目標文件只包含你所編寫的代碼轉換成的機器語言,而可執行文件還包含你所使用的庫例程以及啟動代碼的機器代碼。


Windows系統的集成開發環境

因為 C 編譯器不是標準 Windows 包的一部分,所以需要獲得並安裝一個 C 編譯器。許多廠商都會提供基於 Windows的集成開發環境(IDE) 。

所有編譯器都具有用來裝配C程序的快速,集成的開發環境。關鍵的一點是,它們都具有內置的編輯器,可用來編寫C程序。這類開發環境一般都提供了讓你可以命名和保存原始碼文件的菜單,以及讓你可以不離開IDE就能編譯和運行程序的菜單。

如果編譯器發現任何錯誤,會返回到編輯器中,而且編輯器可以標出有問題的行,並將它們與相應的錯誤消息匹配起來,例如VC6.0、QT、Visual Studio(簡稱vs)。

Windows IDE最初可能讓人有一點望而生畏,因為它們提供多種目標,也就是說,提供了多種可讓程序在其中運行的環境。

例如,它們可能提供16位Windows程序,32位Windows程序,動態連結庫文件(DLL)等等讓你選擇。許多目標都需要引入Windows圖形界面的支持。

為了管理這些選項,通常需要創建一個項目,以便隨後向其中添加將要使用的原始碼文件名。一般來說,首先使用文件菜單來創建一個新的項目。重要的是選取正確的項目形式。本書中的例子是一般性的例子,設計目的是在一個簡單的命令行環境中運行。

因為 Widnows IDE一般可處理 C 和 C++,所以你應該指明你需要一個C程序。在某些產品,可以使用項目類型來指明希望使用 C。而在其他一些產品,如 Microsoft Visual C++中,可以使用.c文件擴展名來指明希望使用 C 而不是 C++。然而,大多數 C 程序也可以作為 C++程序運行。

可能大家在寫完一個程序之後會遇到一個問題:顯示程序執行的窗口在程序終止時突然消失,也就是程序運行後窗口一閃而過。如果遇到這種情況,那麼可以使程序暫停,直到按下 Enter鍵。要做到這一點,請在程序的末尾,恰好在 return 語句之前,添加下面的一行:

getchar();

該行讀取一次按鍵,因此程序將暫停直到按下 Enter 鍵時。有時,根據程序函數的需要,可能已經有一個等待按鍵的指令。在這種情況下,需要使用 getchar()兩次:

getchar();

getchar();

例如,如果程序最後做的事情是請你輸入你的體重,那麼就應當鍵入你的體重並按 Enter 鍵以輸入數據。程序將讀取體重,第1個getchar()將讀取 Enter鍵,第2個getchar()將導致程序暫停,直到再次按下 Enter鍵。如果現在你對此還不太理解,那麼在學習更多關於 C 輸入的知識後你就明白了。

雖然各種IDE都有許多共同的原則,但在細節方面會因產品而異,而在一個產品系列中,又會因版本而異。你必須要經過一些實踐,才能知道編譯器的正確工作方式。


語言標準

目前,有許多 C 實現方式可用。理想情況下,編寫 C 程序時,假如該程序末使用機器特定的編程技能,則它在任何實現方式中的運行應該是相同的。要在實踐中做到這一點,不同的實現方式需要遵守一個公認的標準。

首先說明一點,C語言並沒有官方的標準。不過,Brian Kernighan 和 Dennis Ritchie 編寫的 The C Programming Language 第1版(1978)成為大家接受的標準,通常稱為 K&R C 或經典 C。

特別是這本書附錄中的「C Reference Manual」已成為 C 實現的指南。例如,編譯器都會聲明它可提供一個完整的 K&R 實現。然而,雖然該附錄定義了 C 語言,但是卻沒有定義 C 庫。

因為 C 比大多數其他語言更加依賴庫,所以還需要一個庫標準。因為缺乏任何官方標準,所以提供 UNIX 實現的庫成為一個事實上的標準。


第1個 ANSI/ISO C 標準

隨著 C語言的發展和更加廣泛地用於更多種類的系統上,使用 C 的群體意識到它需要一個更加全面,新穎和嚴格的標準。為了滿足這一要求,美國國家標準代組織(ANSI)在1983年設立了一個委員會以發展一個新的標準,該標準於1989年正式採用。

這個新標準(ANSI C)定義了語言和一個標準 C 庫。國標標準化組織於1990年採用一個 C 標準 (ISO C )。ISO C 和 ANSI C 實質上是同一個標準。

ANSI/ISO標準最終版本通常被稱為 C89 (因為 ANSI於1989年批准了該標準) 或 C90(因為 ISO 於1990年批准了該標準)。然而,因為 ANSI版本是首先出現的,所以人們通常使用ANSI C這一術語。


C99標準

1994年,修訂標準的工作開始了,這一努力的結果是產生了 C99標準。一個聯合 ANSI/ISO委員會籤署了 C90標準的最初原則,包括保持言語短小而簡單。

他們的意圖不是為語言添加新的特性,而是為了滿足新的目標。新目標之一是支持國際化編程,例如,提供了處理國際字符集的方法。第二個目標是「整理現有的慣例以解決明顯的缺點」。

因此,在遇到需要將 C 移植到 64 位處理器時,委員會根據在真實生活中處理問題的人的經驗來添加標準。第三個目標是針對科學和工程項目的重要數字計算改進 C 的適應能力。

國際化,修正其不足和改進計算的實用性這三點是主要的面向改變的目標。形成在關於更改的計劃在性質上更加保守,例如,讓與 C90 和 C++ 的不兼容性達到最小,讓語言在概念上保持簡單。肩帶來說就是希望 C++成為重要的和強有力的語言。

結果是 C99 的修改保持了 C 的本質特性,C 繼續是一種簡短,清楚,高效的語言。本書指出了 C99中的許多修改。因為目前大多數編譯器沒有完全實現所有 C99的修改,所以你可以會發現一些修改在你的系統上不可用。或者你可能會發現,只有修改編譯器的設置以後,才能夠看到一些 C99 的特性。


總結

C 是一種強大,簡潔的程式語言。之所以流行是因為它提供了有用的編程工具和對硬體良好的控制,還因為 C 程序在從一個系統向另一個系統移植方面比大多數程序更容易。C 是一種需要編譯的語言。C 編譯器和連結器是將 C 語言原始碼轉換成可執行代碼的程序。

用 C 編程可能很費力,困難並讓你感到灰心,但這一工作也可能讓你著迷,興奮和感到滿意。

看到這裡是不是又有很多感悟了呢~

如果你很想學會編程,那麼小編推薦我的C語言/C++編程學習基地【私信小編 01 進入】!

都是學編程小夥伴們,帶你入個門還是簡簡單單啦,一起學習,一起加油~

還有許多學習資料和視頻,相信你會喜歡的!

涉及:遊戲開發、常用軟體開發、編程基礎知識、課程設計、黑客等等......

相關焦點

  • 「C語言C++編程入門」——程序結構:構思
    學習程式語言的最好方法是編寫程序。一般來說,初學者編寫的第一個程序是一個名為「Hello World」的程序,它簡單地將「Hello World」列印到你的電腦屏幕上。第2行:)開頭的行是被稱為預處理器的指令讀取和解釋的。它們是在編譯程序本身開始之前解釋的特殊代碼行。
  • 深度理解C語言的編譯機制和語言標準,萬物皆可C!
    編程機制  編寫程序時必須遵循確切步驟主要是取決於你的計算機環境。因為 C語言是可以移植的,所以它在許多環境中可用,其中包括 UNIX,Linux,Windows等等 。  不過,讓我們首先來看一看許多環境所共有的一些方面。你完全不必知道運行一個 C 程序後面的事情,但了解一點是一個很好的背景知識。
  • C語言編程工具選擇
    一、編程工具計算機處理的數據、接受的指令是二進位數據,用C語言編寫的程序需要轉變成計算機能識別的二進位,才能讓計算機工作,這個轉換過程就是使用編譯器對源程序進行編譯,雖然可以使用命令行的方式編譯源程序,但使用編程工具不僅可以編譯源程序,還可以編寫、調試等,可以簡化編程工作。
  • 現代程式語言起點,C語言之環境搭建
    C 語言是一種廣泛使用的計算機語言,它與 Java 程式語言一樣普及,二者在現代軟體程式設計師之間都得到廣泛使用。C 語言被廣泛使用,比如:Linux 作業系統和 RDBMS(關係資料庫管理系統) MySQL 都是使用 C 語言編寫的。
  • C語言編程入門教程 博學谷免費資源分享
    C語言編程入門教程 博學谷免費資源分享發布時間:2020-05-12 14:37:51 瀏覽 4 來源:博學谷作者:吾非魚C語言編程入門教程免費資源分享。C語言編程入門需要學習C++程序結構、類的基本概念、C++與C的關係、C++對C擴展特性、C++ class 基本使用、C語言特性及程序設計的基本方法等內容。小編整理了博學谷C語言編程入門教程免費資源分享給大家:一、《C語言貪吃蛇小項目》通過貪吃蛇小遊戲項目學習C語言,學習C語言數組、C語言指針、C語言結構體、C語言鍊表、貪吃蛇小遊戲實現的知識點。
  • 程式語言:Objective-C和C++有何不同?
    微軟在Build 2015上透露了它的Objective C技術,其最新IDE Visual Studio 2015能將Objective-C代碼編譯運行在Windows 10上。據說,這一技術可以將將Objective-C代碼儘可能多的轉變成Java或C++代碼,掛鈎進原生平臺的 API。那麼同樣是「C」,Objective-C和C++之間有何不同?
  • Linux下C編程基礎之:Linux下C語言編程概述
    由於它的硬體無關性和可移植性,使C語言逐漸成為世界上使用最廣泛的計算機語言。本文引用地址:http://www.eepw.com.cn/article/257154.htm為了進一步規範C語言的硬體無關性,1987年,美國國家標準協會(ANSI)根據C語言問世以來各種版本對C語言的發展和擴充,制定了新的標準,稱為ANSIC。
  • 編程入門選什麼語言好?C 語言還是Python?為你解析
    前面我分享過計算機行業已經成了學校選擇排名第一,家長和學生都很看好計算機類專業。現在IT行業也越來越火爆,程式設計師越來越被人看好。面對相比同齡人高薪資的誘惑,人們很難不心動,即使禿頭也值得!那麼問題來了,對剛接觸這個領域的新人來說,選什麼語言作為第一門語言呢?
  • C語言教程
    變量在編譯時為其分配相應存儲單元。  數組----C++語言代碼如果一個變量名後面跟著一個有數字的中括號,這個聲明就是數組聲明。字符串也是一種數組。  字符串----C語言的字符串其實就是char型數組,使用字符型並不需要引用庫,但是使用字符串就就需要C標準庫裡面的一些用於對字符串進行操作的函數。它們不同於字符數組。
  • Linux下C語言編譯的問題
    我們開始編譯main.c  gcc -c main.c  這時,則生成了main.o文件,然後我們再通過如下命令進行連結希望得到可執行程序。  /test.a //註:./ 是給出了test.a的路徑  【擴展】:同樣,為了把問題說清楚,上面我們把代碼的編譯連結分開了,如果希望一次性生成可執行程序,則可以對main.c和test.a執行如下命令。  gcc -o main main.c ./test.a //同樣,如果不加test.a也會報錯  3.
  • C++相比其他語言到底難在哪裡?
    c/c++自02年以來,不管時代如何發展,其排名一直在前五以內,足見其在程式語言界的地位。大家都知道c++完全兼容c,c++是c語言的增強版,如果沒有學習過c語言或者先學習的其他語言,比如c#,再學習c++就會覺得好難呀,那麼c++相比其他語言到底難在哪裡呢
  • 那些程式語言之父們(下)
    上一篇那些程式語言之父們(中)我們介紹了遠古的程式語言,這次我們介紹幾個21世紀才出現的程式語言。golang之父們c語言有太多的缺點,很多語言又達不到c語言的運行效率,而go運行速度即快,又有很多新重要的新特性,go語言編譯型語言,支持並發計算,自帶垃圾回收。
  • TIOBE9月程式語言排行,C++增速最快C++20的功勞?
    TIOBE 指數旨在反映程式語言受歡迎程度的變化。微軟工程師、WG21 主席 Herb Sutter 稱,C++20 是「自 C++11 以來最大的發行版本」。C++20 中的兩個關鍵特性是「模塊」(modules)和「協程」(coroutines)。
  • 自學編程如何選擇程式語言?
    而我們的程式語言,基本上也是這樣,豐富多樣,各有特色,側重點也各不相同。如果說非要選一份萬能語言,那麼肯定是二進位代碼以及作為二進位代碼助記符的彙編了,但如果你選彙編去作為初學者入門課程,那估計你堅持不下來兩天。而在如此多的程式語言中,我們應該選擇什麼樣的語言作為入門呢?新手通常會很煩惱,而患上選擇困難症。
  • 常用程式語言的優缺點(上)
    PHP是解釋性的腳本語言,寫完代碼以後即可以執行,不像c,java,c++等語言還需要去編譯執行,相對來說比較節省時間。10.相對來說,PHP程式設計師的薪水的平均工資要比c,c++,java程式設計師的平均工資要低一些,特別是對於中小型企業來說可以節約一些成本。
  • C+相比其他語言到底難在哪裡?
    看過程式語言排行榜的都知道,c/c++自02年以來,不管時代如何發展,其排名一直在前五以內,足見其在程式語言界的地位。編程界流行這麼一句話:c幾乎什麼都能做,c++幾乎什麼都能做好,足見其功能的強大。
  • C語言學習篇(32)——為什麼C語言不能函數重載
    函數返回值不是函數重載的判斷標準!使用objdump工具反彙編 大家都知道了在C語言中不能函數重載, 究其原因是否思考過呢?接下來我們以下c和c++代碼為例子,分別用gcc和 g++編譯, 然後再用objdump工具反彙編看看得到的彙編代碼有什麼區別。
  • C語言程序設計教程
    導讀:C語言是一門通用的計算機程式語言,應用非常得廣泛,在計算機、單片機以及工業上都有的莫大的貢獻,今天我們來學習如何進行C語言程序設計。
  • 「記」詳解C語言之格式
    文@侍郎不是狼啦#C語言初學#在開始說明本文主題之前,我想有必要科普下C語言的歷史:C語言誕生於美國的貝爾實驗室,由D.M.Ritchie以B語言為基礎發展而來,在它的主體設計完成後,Thompson和Ritchie用它完全重寫了UNIX,且隨著UNIX的發展,c語言也得到了不斷的完善。
  • python語言基礎-6:程式語言是萬能的麼?
    正在學習編程的朋友,會不會有這樣的疑惑:程式語言,是萬能的麼?由於計算機不是萬能的,所以在計算機上運行的程式語言肯定也不是萬能的。但正如上一節課程中講道:編程的本質就是對普適的計算機進行功能特定化,而編程的具體工作則是控制輸入、輸出和計算過程。我們把標題的這個問題更加準確地表述一下:通過編程,是否能夠發揮出普適計算機的全部潛力?