【C語言】02.第一個C語言程序

2021-02-24 編程雜貨檔

本文目錄

前言

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

二、編譯程序

三、連結程序

四、運行程序

五、總結

六、學習建議

七、clang指令匯總

前言

前面已經嘮叨了這麼多理論知識,從這講開始,就要通過接觸代碼來學習C語言的語法。學習任何一門語言,首先要掌握的肯定是語法。學習C語言語法的目的:就是能夠利用C語言編寫程序,然後運行程序跟硬體(計算機、手機等硬體設備)進行交互。由於我們的最終目的是學習iOS開發,學習iOS開發的話必須在Mac系統下,因此我就在Mac系統環境下開發C語言程序,而不是在Windows環境下。

 

接下來,就在Mac系統環境下編寫第一個C語言程序,最後把程序運行起來,跟計算機做一個小小的互動

一、編寫第一個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函數。

需要注意的是:

 

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系統版本

  

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的可執行文件

來自:博客園

連結:http://www.cnblogs.com/mjios/archive/2013/05/06/3062576.html

相關焦點

  • C語言的第一個程序
    事實上執行 C 語言所寫的程序時,編譯器會將你的 C 語言代碼編譯成彙編語言,再由彙編語言的編譯器編譯為機器語言,進而讓 CPU 理解和執行。通常我們看到的可執行文件事實上就是機器語言的形式。相信大家在我和廠長的序言中已經看到,C 語言是算法工程師的基礎,更是計算機相關行業秋招的基本要求。事實確實是這樣,但是什麼原因使得 C 語言具有這樣的地位呢?主要是以下三點。
  • 用C語言程序比大小及C語言程序的結構
    因為在主函數中要調用max函數,而max函數的定義卻在main函數之後,對對程序的編譯是自上而下進行的,在對程序c=max(a,b);進行編譯時,編譯系統無法知道max是什麼,因而無法把它作為函數調用處理。
  • 用c語言編寫表白程序_c語言編寫表白程序
    用c語言編寫表白程序?c語言編寫表白程序?
  • 程序設計(C語言)
    選項:A:C語言程序將從源程序中第一個函數開始執行B:可以在程序中由用戶指定任意一個函數作為主函數,程序將從此開始執行C:C語言規定必須用main作為主函數名,程序將從此開始執行,在此結束D:main可作為用戶標識符,用以命名任意一個函數作為主函數答案: 【C語言規定必須用main作為主函數名,程序將從此開始執行,在此結束】7、單選題:
  • C語言程序設計複習題
    C語言源程序可以直接在DOS環境中運行B.Turbo C系統不提供編譯和連接C 程序的功能C.編譯C語言源程序得到目標程序可以直接在DOS環境中運行D.C語言源程序連接得到的可執行程序可以直接在DOS環境中運行20、下列敘述錯誤的是DA.break語句可以使程序從switch語句中跳出來B.continue 語句是為了結束本次循環
  • C語言基礎:第一個最簡單程序——Hello World!
    《C語言基礎》這個系列是面向一些C語言的初學者,所以裡面的內容比較淺顯易懂,很多問題和知識點並沒有深入去挖掘,也就是說這個系列是一個入門級教材,幫大家快速的找到一個學習C語言的方向。        我們首先來看一個最簡單的C程序——Hello World!
  • c語言編寫表白程序_簡短編寫c語言表白程序
    c語言編寫表白程序?簡短編寫c語言表白程序?
  • C語言編寫程序求水仙花數
    C語言編寫程序求水仙花數水仙花數是一個數學問題,其實質是一個三位數,個位數的立方加十位數的立方加百位數的立方之和等於這個三位數本身。例如153=1*1*1+5*5*5+3*3*3,即153=1+125+27。
  • C語言入門
    這些都可以用來編寫C語言程序。2、什麼是編譯器通過編輯器寫出的代碼只是源程序的文本文件,必須經過編譯之後才可以在電腦上運行。常用的編譯器有:microsoft C++Compiler、gcc等。3、什麼是集成開發環境(IDE)集成開發環境就是為程序開發提供的環境應用軟體,裡面集成了編輯器和編譯器。
  • c語言的簡單排序程序應用
    收錄於話題 #c語言 今天我們來分享幾個關於排序的簡單C語言程序,話不多說馬上開始:首先我們結束參量比較轉化法,此方法針對較少數據是非常好用,其核心
  • 加速程序開發 Python整合C語言模塊
    而作為軟體開發的傳統程式語言——C語言,卻能在這些問題上很好地彌補Python語言的不足。因此,本文通過實例研究如何在Python程序中整合既有的C語言模塊,包括用C語言編寫的源程序和動態連結庫等,從而充分發揮Python語言和C語言各自的優勢。Python語言的特點Python作為一門程序開發語言,被越來越多地運用到快速程序開發。
  • 「C語言從入門到入土」必備C語言基礎筆記整理
    一、C語言1、什麼是C語言?C語言是人寫機器看的一種語言。C語言是高級語言中的低級語言。C語言貼近硬體。C語言的入門學習比較簡單。彙編語言——>B語言——>C語言2、C語言的特性首先C語言就是你的女朋友。無論你讓它幹什麼,它絕對不會自己找到方法。
  • 10個經典的C語言小程序
    今天給大家分享10個比較基礎的C語言的小程序,希望給C語言初學者帶來一定幫助。
  • c語言經典小程序匯總大全
    當然,如果你覺得學習程式語言很痛苦,堅持了一段時間後無果,南無果斷放棄未必不是一個好的選擇。 經典C語言小程序10例,今天給大家分享10個比較基礎的C語言的小程序,附上幾個常用的10個小例,希望給C語言初學者帶來一定幫助,熟練運用,舉一反三。
  • 10 個經典的 C 語言小程序
    今天給大家分享10個比較基礎的C語言的小程序,希望給C語言初學者帶來一定幫助。程序原始碼:#include "stdio.h" main() { char a=176,b=219; printf("%c%c%c%c%c\n",b,a,a,a,b); printf("%c%c%c%c%c\n",a,b,a,b,a); printf("%c%c%c%c%c\n
  • C語言,美麗的語言
    當我瀏覽C語言代碼時,我也感覺到了相同的美。 在不忙的日子裡,我會隨意的查看C語言的內核,sched.c, page_alloc.c 等等。它讓我感覺我正在欣賞一種很有生命力的東西。我能看到這些代碼指引著程序的執行,邏輯指令管控制程序能量的分派使用。雖然我不是內核的開發者,但我 完全能捕捉到眼前代碼的脈絡 —— 只是通過觀看這些代碼的「運動」。
  • PIC單片機C語言程序設計(4)
    2.if語句  if 語句也稱為條件語句,是C 語言中轉移語句之一。在設計C 語言程序時,常常要根據某些條件以決定程序運行的流向,這時就需要if 語句來實現。
  • C語言簡明教程(四)選擇程序設計
    >(四)選擇程序設計實驗內容前面講述了順序結構設計,同時在裡面穿插了 C 語言的數據類型和運算符等內容。我們 6-1.c 的例子便是上面你的第二種形式,6-2.c 的例子便是第一種形式。C 語言提供的 switch 語句直接處理多分支選擇。
  • 用Python使用C語言程序(Windows平臺)
    qianyan在機器學習中,很多時候我們需要Python和C的混合編程,最重要的原因是為了性能效率的提升: 解釋型語言一般比編譯型語言慢,一般提高性能的有效做法是,先做性能測試,找出性能瓶頸部分,然後把瓶頸部分在擴展中實現。本文的目標是在windows平臺下(使用pycharm),實現python調用C語言編寫的程序。
  • 為女生寫的c語言表白程序_表白程序c語言
    為女生寫的c語言表白程序?表白程序c語言?