寫一個c語言程式

來源:互聯網
上載者:User

標籤:

一、編寫第一個C語言程式-Hello World

為什麼稱第一個程式為“Hello Wolrd”呢?其實電腦行業裡面,學習任何技術的第一個程式都可以稱為“Hello World”。“Hello World”的字面意思是“你好,世界”,也就是跟世界打招呼。我們第一個程式在這世界上誕生了,那肯定要跟世界打聲招呼嘛,所以就稱為“Hello World”。

1.用什麼工具寫代碼

首先我們要做的肯定是寫代碼,在代碼裡面說清楚想要電腦做出怎樣的操作。其實寫代碼就像平時寫文章一樣,只是在電腦上寫一些常值內容,那用什麼工具來寫代碼嗎?平時我們在Windows中寫文章,可以用記事本、Word等文本編輯工具。在Mac中呢,我們可以安裝一些文本編輯工具來寫代碼,比如UltraEdit(點選連結可以下載UltraEdit)。當然,在實際開發中,為了提高開發效率,一般會使用開發工具,開發工具的好處,我在前面文章中已經說過了。不過呢,開發工具屏蔽了很多操作細節和文法細節,不利於初學者直觀、系統地學習一門語言。因此,在這裡,我們暫時使用文本編輯工具UltraEdit來寫C語言代碼。

 

2.寫代碼1> C程式由函數構成

寫代碼之前,你首先要知道:任何一個C語言程式都是由一個或者多個程式段(小程式)構成的,每個程式段都有自己的功能,我們一般稱這些程式段為“函數”。所以,你可以說C語言程式是由函數構成的。

比如你用C語言編寫了一個MP3播放器程式,那麼它的程式結構如所示:

  • 從可以看出:函數就是用來實現某個功能的程式段,每一個函數都有自己的功能。因此,你應該把實現某個功能所需的代碼都寫在函數中。比如,有個函數的功能是播放MP3,那麼播放MP3的代碼都應該寫到這個函數中。
  • 當調用(執行)一個函數時,電腦就會按順序執行函數中的所有代碼,從而展示函數所實現的功能。
  • 一般來說,我們會將不同的功能交給不同的函數去實現。比如,將暫停播放MP3的代碼寫到一個函數中,將停止播放MP3的代碼寫到另一個函數中。因此,一個C程式中可能會有很多的函數。

 

2> C程式的入口

前面說到:一個C程式中可能會有很多的函數,這樣就會有個疑問:當我們運行整個程式時,在眾多函數中,電腦會先執行哪個函數呢?也就是說,一個C程式的入口在哪裡?我寫了幾千行的代碼,應該先從哪一行代碼開始執行啊?是從第一行代碼還是從最後一行代碼開始執行啊?

其實,C程式的入口是一個名字叫做main的函數,簡稱main函數。(為了區分函數,每一個函數都有一個名稱)也就是說,不管整個程式中有多少個函數,都是先執行main函數。不管main函數寫在檔案中間,還是檔案末尾,也都是先執行main函數。

需要注意的是:

  • 如果一個C程式中沒有main函數,那麼這個程式就不具備啟動並執行能力。連程式的入口都沒有,還運行什嗎?
  • 一個C程式中只能有一個main函數。想象一下也知道,如果有多個main函數,究竟先執行哪一個main函數呢?這會讓電腦無法選擇

 

3> 編寫main函數

現在已經知道,要想運行一個C程式,必須有一個main函數,接下來就在文本編輯工具中編寫一個main函數。main函數的格式大致如下:

  • 第1行的int暫時不用去理解,先認為是main函數的固定寫法
  • 第1行的main是函數名稱,main後面的一對小括弧()是函數的標誌,絕對不能缺少!而且這對小括弧是“英文括弧()”,不是“中文括弧()”!
  • 第2行開始,有一對大括弧{},函數內部的代碼都要寫到這對大括弧裡面。每一個函數都有一對{},{}裡面的內容可以稱為“函數體”。
  • 在第3行添加了一行return 0;,暫時不用理解它的意思,先認為是main函數的固定寫法。
  • 像第3行這種寫在函數中的代碼可以稱為一條“語句”。寫完一條語句後,要在尾部加上一個分號“;”,代表語句結束了

 

4> 編寫輸出語句

接下來在main函數中添加代碼。

1 #include <stdio.h>2 3 int main()  4 {  5     printf("Hello World\n");6     return 0;7 }
  • 在第5行添加了一條語句printf("Hello World\n");,這條語句的作用是讓電腦在螢幕上輸出用雙引號""括住的內容:Hello World,後面的"\n"是一個逸出字元,表示斷行符號換行,因此,輸出Hello Wrold這一串內容後會自動換行。至於為什麼這條語句要這樣寫?為什麼這條語句能讓電腦輸出東西?這些疑問都先擱著,以後會詳細解釋。
  • 為了保證第5行代碼的正常使用,就在main函數的前面加了一行代碼#include <stdio.h>,暫時不用去深刻瞭解它的意思,默默加上即可,注意,這裡是不用加上分號";"的
  • 當運行這個程式,就會先執行main函數,接著就會按順序執行main函數大括弧{}中的所有語句(第5行、第6行語句)
  • 需要注意的是:main函數中所有語句都必須寫在第6行return 0;語句的前面,先別問為什麼,以後會詳細介紹

 

3.儲存為C程式的源檔案

代碼寫完了,總得儲存起來吧,儲存為什麼格式的檔案呢?每個檔案都有自己的拓展名,不同的拓展名就代表著不同類型的檔案,比如.mp3代表著音頻檔案,.txt代表著文字檔。我們前面編寫的C語言代碼,應該儲存為一個拓展名為.c的檔案,這個.c檔案稱為C語言程式的“原始碼檔案”,也稱為“源檔案”。

按下快速鍵command + s,輸入檔案名稱(我這裡叫做one.c),選擇檔案格式

就這樣,第一個C語言程式就寫完了,非常簡單吧,一點壓力都沒有

 

回到頂部二、編譯器

前面已經把程式寫好了,迫不及待想做的事情肯定是運行程式,看看電腦會有什麼反應。遺憾的是,前面編寫好的one.c檔案還不能夠運行。上一篇文章已經說過了,電腦只能識別0和1組成的機器指令,你現在寫的這些什麼int、main這些英文,它是看不懂的。我們需要使用C語言編譯器,將源檔案翻譯成只有0和1的二進位檔案,這個翻譯過程,我們稱之為“編譯”。

Mac系統上支援一款叫做gcc的編譯器,gcc支援多種程式設計語言:C語言、C++、Objective-C、Java等。在後來,蘋果公司自己開發了一款叫做clang的編譯器,目標就是要超越gcc。我們這裡就採用clang編譯器來編譯器。要想在Mac中使用clang編譯器,首先要安裝一個命令列工具(Command Line Tools)

1.下載安裝命令列工具

安裝命令列工具的方式有2種。

1> 方式一:直接到蘋果官網下載

先點擊螢幕左上方的“蘋果表徵圖”,查看你的Mac系統版本

  

  • 如果你的Mac是Lion系統(版本<=10.7),請選擇下載:
  • 如果你的Mac是Mountain Lion系統(版本>=10.8),請選擇下載:

2> 方式二:先到蘋果官網下載安裝Xcode,然後開啟Xcode,在Xcode中安裝命令列工具

 

2.開啟終端

安裝完命令列工具後,就可以使用clang編譯器了。那怎麼使用clang呢?通過在“終端”中輸入相應的clang指令來啟動編譯器。

預設情況下,終端所指向的路徑是使用者的個人主資料夾,我的主資料夾是/Users/apple,我的使用者名稱叫apple

 

3.跳轉到one.c所在的路徑

為了方便操作,我們應該將終端的路徑切換到one.c所在的路徑,one.c存放在我的案頭,檔案夾路徑是/Users/apple/Desktop

輸入指令:cd /Users/apple/Desktop , 然後敲斷行符號,指令"cd"是改變路徑的意思。

 

4.輸入編譯指令,編譯one.c檔案

輸入指令:cc -c one.c , 然後敲斷行符號

指令"cc -c"表示編譯某個源檔案,後面跟上源檔案的名稱或者全路徑。

如果敲完編譯指令後,沒有顯示太多的資訊,說明你編譯成功了。編譯成功後,會在終端所在的路徑下產生一個二進位檔案,稱為“目標檔案”,拓展名為".o",檔案名稱與源檔案一致。one.c檔案編譯成功後就產生了one.o檔案。

補充:在開發過程中,不可能將所有的代碼都寫在一個.c檔案中,為了模組化開發,一般會將不同的功能寫到不同的源檔案中。如果要同時編譯多個源檔案,這樣寫:cc -c one.c two.c three.c。源檔案編譯之後,每個源檔案都會產生對應的.o檔案,比如two.c產生了two.o、three.c產生了three.o

 

5.編譯器的文法檢測

編譯器除了能將.c源檔案編譯成.o目標檔案之外,還有一個非常重要的功能:文法檢測。跟英語一樣,C語言也有自己的文法,如果你不按照C語言文法去寫代碼,那就無法編譯成功。產生目標檔案之前,編譯器會先檢查.c檔案是否有語法錯誤,如果出現語法錯誤,會列出錯誤的總個數、錯誤原因和錯誤碼的行號,這時候就不會產生目標檔案;必須修正相應的語法錯誤,重新編譯成功後,才會產生目標檔案。

接下來我把代碼故意寫錯,第3行把int寫成了intt,第5行語句少了一個分號";"

1 #include <stdio.h>2 3 intt main()4 {  5     printf("Hello World\n")6     return 0;7 }

重新儲存源檔案,在終端中重新編譯一下

它說得非常明顯:有2個錯誤,第1個錯誤是在one.c的第3行,第2個錯誤是在one.c的第5行。這些錯誤資訊(error)是一定要修改的,只要有一個錯誤資訊存在,就不可能編譯成功。以後還有可能會遇到一些“警告資訊(warning)”,警告資訊可以忽略,不影響編譯。

 

回到頂部三、連結程式1.什麼是連結

源檔案編譯成功後,會產生一個.o目標檔案,這就是一個二進位檔案,但是,還是不能運行。目標檔案不能啟動並執行主要原因有2個:

1> 在開發過程中,不可能將所有的代碼都寫在一個.c檔案中,為了模組化開發,一般會將不同的功能寫到不同的源檔案中。源檔案編譯之後,每個源檔案都有對應的.o檔案,比如two.c產生了two.o、three.c產生了three.o,這些.o檔案都不能單獨運行,它們之間都有密不可分的關係,需要將所有相關聯的.o目標檔案組合在一起。

2> 除開組合所有的目標檔案之後,還需要將C語言的函數庫包含進來,才能產生可執行檔。

將所有相關聯的.o目標檔案、以及C語言函數庫組合在一起產生可執行檔的過程,我們稱為“連結”。

 

2.連結目標檔案

在終端中輸入指令:cc one.o , 然後敲斷行符號。如果要同時連結多個目標檔案,這樣寫:cc one.o two.o three.o

連結成功後,會產生一個可執行檔,預設的名稱叫做“a.out”。由於我們是在mac系統下產生了可執行檔,mac系統是基於UNIX系統的,所以這個檔案只能在UNIX系統中運行。如果是在Windows環境下,產生的可執行檔拓展名為".exe"。

  

 

3.更改可執行檔的名稱

如果想更改可執行檔的名稱,可以輸入指令:cc -o one one.o,-o後面跟上可執行檔的名稱,因此可執行檔的名稱就變成了one

 

4.連續執行編譯、連結

其實也可以在終端中直接輸入:cc one.c , 會按順序執行編譯、連結兩個操作。

這條命令產生一個名為"a.out"的可執行程式。中間會產生一個名為one.o的目標檔案,但它在連結完成後會被刪除。

如果想修改可執行檔的名稱,跟前面是一樣的,指令為:cc -o abc one.c , 可執行檔的名稱為abc

 

回到頂部四、運行程式

經過前面幾個步驟後,終於產生了可執行檔,接下來就可以運行這個程式了。運行程式有2種方式:

1.在終端中輸入指令運行程式

在終端中輸入:./a.out,敲斷行符號就可以運行這個程式。這裡a.out是可執行檔的名稱。

敲完指令後,你會發現螢幕上輸出了一句“Hello World”。就這樣,我們成功跟電腦來了一點小小的互動,它替我們輸出了一句文字。

 

2.雙擊可執行檔

直接雙擊a.out檔案,選擇用終端來運行程式

運行成功後

 

回到頂部五、總結

經過一番折騰,終於將第一個C程式運行成功了,總共有4個步驟:編寫程式 -> 編譯 -> 連結 -> 運行

需要注意的是:

  • 中間某個環節出錯了,那麼就不會有後面的操作。比如編譯出錯了,那麼就不可能有連結這個環節。
  • 如果你對原始碼進行了修改,那麼需要重新編譯、連結之後再運行程式,這樣才能看到最新的效果。

 

回到頂部六、學習建議1.學編程並不是學英文

寫完這個Hello World程式後,可能很多人會去查單詞,看看int什麼意思、看看那stdio、return又是什麼意思。其實,這是非常沒必要的做法,我們學的是編程,並不是學英文,沒有必要一個一個詞語地去扣。再說,這些詞語對電腦來說並不是什麼英文單詞,僅僅是個符號、是代碼!!!電腦只能識別0和1,因此還要將這些代碼編譯成0和1之後才能被電腦所執行。電腦並不是有道詞典,它不可能認識什麼英文單詞。很多代碼都是固定寫法,並沒有太多的所謂英文含義。

 

2.程式的可讀性

這個Hello World程式的功能很少,只有一丁點內容,我們就佔用了好幾行行代碼。有人可能會問:這些代碼一定要換行嗎?第5行prinf語句的前面一定要要縮排幾個空格嗎?

其實,你完全可以不縮排

1 #include <stdio.h>2 3 int main()  4 {  5 printf("Hello World\n");6 return 0;7 }

也可以將所有的代碼都寫成一行(第1行代碼比較特殊,必須獨立一行)

1 #include <stdio.h>2 int main()  {printf("Hello World\n");return 0;}

這樣寫雖然沒有問題,但是代碼可讀性非常地差,想象一下也知道:整個檔案中就一行代碼,如果這個程式很大的話,肯定很多代碼,這樣的代碼是有多噁心啊!別人 可能根本看不太懂你寫的是什麼東西,甚至你自己都看不太懂。在工作中,我們難免會遇到難題,經常要求助於他人,但是別人要在看得懂我們代碼的基礎上,才能 幫我們解決問題啊。因此,代碼的可讀性很重要!一定要養成良好的編程習慣。

 

3.初學者不要過於尋根問底

當你對一門新技術還不是很瞭解的時候,你首先要做的事情是學會怎麼使用它,先把它成功用起來,並不是從頭到尾看清楚所有的原始碼、把每一行代碼中的每個詞語都摸清楚什麼意思,完全沒有這個必要。等你有一定的技術基礎了,這門技術用得很熟了,而且時間和能力允許的話,才有必要去尋根問底地解讀所有的原始碼。所以,第一個C程式的代碼中很多不懂的地方,暫時不用去糾結,學到後面了,你就會不自覺地就知道它們是什麼意思了。

 

回到頂部七、clang指令匯總

這些指令不用去死記,大致有個瞭解,用到時再來查資料即可

1.編譯單個c源檔案,併產生一個目標檔案

cc -c one.c
這條命令產生一個名為one.o的目標檔案

 

2.編譯多個c源檔案,並為每個檔案產生一個目標檔案

cc -c one.c two.c three.c
這條命令產生3個目標檔案:one.o、two.o、three.o

 

3.連結單個目標檔案

cc one.o
這條命令產生一個名為a.out的可執行檔

 

4.連結多個目標檔案

cc one.o two.o three.o
這條命令產生一個名為a.out的可執行檔

 

5.編譯並連結一個c源檔案

cc one.c
這條命令產生一個名為a.out的可執行檔。中間會產生一個名為one.o的目標檔案,但它在連結過程完成後會被刪除。

 

6.編譯並連結多個c源檔案

cc one.c two.c three.c
這條命令產生一個名為a.out的可執行檔。當編譯的源檔案超過一個時,目標檔案便不會被刪除。這就允許你對程式進行修改後,只對那些進行過改動的源檔案進行重新編譯。

 

7.編譯一個c源檔案,並把它和現存的目標檔案連結在一起

cc one.o two.o three.c
這條命令產生一個名為a.out的可執行檔

 

8.上面那些可以產生可執行檔的指令均可以加上“-o name”這個選項,產生的可執行檔就叫做name

比如 cc -o abc one.c
這條指令會產生一個名為abc的可執行檔

 

9.執行可執行檔

./a.out
這條指令可以執行一個名為a.out的可執行檔

   

寫一個c語言程式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.