<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                本文目錄 - [前言](http://www.cnblogs.com/mjios/archive/2013/05/06/3062576.html#label0) - [一、編寫第一個C語言程序-Hello World](http://www.cnblogs.com/mjios/archive/2013/05/06/3062576.html#label1) - [二、編譯程序](http://www.cnblogs.com/mjios/archive/2013/05/06/3062576.html#label2) - [三、鏈接程序](http://www.cnblogs.com/mjios/archive/2013/05/06/3062576.html#label3) - [四、運行程序](http://www.cnblogs.com/mjios/archive/2013/05/06/3062576.html#label4) - [五、總結](http://www.cnblogs.com/mjios/archive/2013/05/06/3062576.html#label5) - [六、學習建議](http://www.cnblogs.com/mjios/archive/2013/05/06/3062576.html#label6) - [七、clang指令匯總](http://www.cnblogs.com/mjios/archive/2013/05/06/3062576.html#label7) [回到頂部](http://www.cnblogs.com/mjios/archive/2013/05/06/3062576.html#labelTop) ##前言 前面已經嘮叨了這么多理論知識,從這講開始,就要通過接觸代碼來學習C語言的語法。學習任何一門語言,首先要掌握的肯定是語法。學習C語言語法的目的:就是能夠利用C語言編寫程序,然后運行程序跟硬件(計算機、手機等硬件設備)進行交互。由于我們的最終目的是學習iOS開發,學習iOS開發的話必須在Mac系統下,因此我就在Mac系統環境下開發C語言程序,而不是在Windows環境下。 接下來,就在Mac系統環境下編寫第一個C語言程序,最后把程序運行起來,跟計算機做一個小小的互動 [回到頂部](http://www.cnblogs.com/mjios/archive/2013/05/06/3062576.html#labelTop) ##一、編寫第一個C語言程序-Hello World 為什么稱第一個程序為“Hello Wolrd”呢?其實計算機行業里面,學習任何技術的第一個程序都可以稱為“Hello World”。“Hello World”的字面意思是“你好,世界”,也就是跟世界打招呼。我們第一個程序在這世界上誕生了,那肯定要跟世界打聲招呼嘛,所以就稱為“Hello World”。 ### 1.用什么工具寫代碼 首先我們要做的肯定是寫代碼,在代碼里面說清楚想要計算機做出怎樣的操作。其實寫代碼就像平時寫文章一樣,只是在電腦上寫一些文本內容,那用什么工具來寫代碼么?平時我們在Windows中寫文章,可以用記事本、Word等文本編輯工具。在Mac中呢,我們可以安裝一些文本編輯工具來寫代碼,比如[UltraEdit(點擊鏈接可以下載UltraEdit)](http://blog.csdn.net/leonpengweicn/article/details/8177818)。當然,在實際開發中,為了提高開發效率,一般會使用開發工具,[開發工具的好處](http://www.cnblogs.com/mjios/archive/2013/04/27/3046049.html),我在前面文章中已經說過了。不過呢,開發工具屏蔽了很多操作細節和語法細節,不利于初學者直觀、系統地學習一門語言。因此,在這里,我們暫時使用文本編輯工具[UltraEdit](http://blog.csdn.net/leonpengweicn/article/details/8177818)來寫C語言代碼。 ![](https://box.kancloud.cn/2016-05-07_572d6041e87e1.png) ### 2.寫代碼 **1,C程序由函數構成** 寫代碼之前,你首先要知道:任何一個C語言程序都是由一個或者多個程序段(小程序)構成的,每個程序段都有自己的功能,我們一般稱這些程序段為“函數”。所以,你可以說C語言程序是由函數構成的。 比如你用C語言編寫了一個MP3播放器程序,那么它的程序結構如下圖所示: ![](https://box.kancloud.cn/2016-05-07_572d60420e413.png) - 從上圖可以看出:函數就是用來實現某個功能的程序段,每一個函數都有自己的功能。因此,你應該把實現某個功能所需的代碼都寫在函數中。比如,有個函數的功能是播放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函數的格式大致如下: ![](https://box.kancloud.cn/2016-05-07_572d60422d8e4.png) - 第1行的int暫時不用去理解,先認為是main函數的固定寫法 - 第1行的main是函數名稱,main后面的一對小括號()是函數的標志,絕對不能缺少!而且這對小括號是“英文括號()”,不是“中文括號()”! - 第2行開始,有一對大括號{},函數內部的代碼都要寫到這對大括號里面。每一個函數都有一對{},{}里面的內容可以稱為“函數體”。 - 在第3行添加了一行return 0;,暫時不用理解它的意思,先認為是main函數的固定寫法。 - 像第3行這種寫在函數中的代碼可以稱為一條“語句”。寫完一條語句后,要在尾部加上一個分號“;”,代表語句結束了 **4,編寫輸出語句** 接下來在main函數中添加代碼。 ~~~ #include <stdio.h> int main() { printf("Hello World\n"); return 0; } ~~~ - 在第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),選擇文件格式 ![](https://box.kancloud.cn/2016-05-07_572d60424c636.png) 就這樣,第一個C語言程序就寫完了,非常簡單吧,一點壓力都沒有 [回到頂部](http://www.cnblogs.com/mjios/archive/2013/05/06/3062576.html#labelTop) ##二、編譯程序 前面已經把程序寫好了,迫不及待想做的事情肯定是運行程序,看看計算機會有什么反應。遺憾的是,前面編寫好的one.c文件還不能夠運行。[上一篇文章](http://www.cnblogs.com/mjios/archive/2013/05/03/3052593.html)已經說過了,計算機只能識別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,方式一:直接到[蘋果官網下載](https://developer.apple.com/downloads/index.action) 先點擊屏幕左上角的“蘋果圖標”,查看你的Mac系統版本 ![](https://box.kancloud.cn/2016-05-07_572d604271055.png) ?![](https://box.kancloud.cn/2016-05-07_572d604289bd4.png) - 如果你的Mac是Lion系統(版本<=10.7),請選擇下載:![](https://box.kancloud.cn/2016-05-07_572d6042a0a1d.png) - 如果你的Mac是Mountain Lion系統(版本>=10.8),請選擇下載:![](https://box.kancloud.cn/2016-05-07_572d6042b2d9c.png) 2,方式二:先到[蘋果官網下載](https://developer.apple.com/downloads/index.action)安裝Xcode,然后打開Xcode,在Xcode中安裝命令行工具 ![](https://box.kancloud.cn/2016-05-07_572d6042c8731.png) ![](https://box.kancloud.cn/2016-05-07_572d6042e3ec7.png) ### 2.打開終端 安裝完命令行工具后,就可以使用clang編譯器了。那怎么使用clang呢?通過在“終端”中輸入相應的clang指令來啟動編譯器。 ![](https://box.kancloud.cn/2016-05-07_572d6043138e8.png) 默認情況下,終端所指向的路徑是用戶的個人主文件夾,我的主文件夾是/Users/apple,我的用戶名叫apple ![](https://box.kancloud.cn/2016-05-07_572d60432d8da.png) ### 3.跳轉到one.c所在的路徑 為了方便操作,我們應該將終端的路徑切換到one.c所在的路徑,one.c存放在我的桌面,文件夾路徑是/Users/apple/Desktop 輸入指令:cd /Users/apple/Desktop?, 然后敲回車,指令"cd"是改變路徑的意思。 ![](https://box.kancloud.cn/2016-05-07_572d60434294c.png) ### 4.輸入編譯指令,編譯one.c文件 輸入指令:cc -c one.c?, 然后敲回車 指令"cc -c"表示編譯某個源文件,后面跟上源文件的名稱或者全路徑。 ![](https://box.kancloud.cn/2016-05-07_572d60435bb7d.png) 如果敲完編譯指令后,沒有顯示太多的信息,說明你編譯成功了。編譯成功后,會在終端所在的路徑下生成一個二進制文件,稱為“目標文件”,拓展名為".o",文件名與源文件一致。one.c文件編譯成功后就生成了one.o文件。 ![](https://box.kancloud.cn/2016-05-07_572d6043726da.png) 補充:在開發過程中,不可能將所有的代碼都寫在一個.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行語句少了一個分號";" ~~~ #include <stdio.h> intt main() { printf("Hello World\n") return 0; } ~~~ 重新保存源文件,在終端中重新編譯一下 ![](https://box.kancloud.cn/2016-05-07_572d60438e3e1.png) 它說得非常明顯:有2個錯誤,第1個錯誤是在one.c的第3行,第2個錯誤是在one.c的第5行。這些錯誤信息(error)是一定要修改的,只要有一個錯誤信息存在,就不可能編譯成功。以后還有可能會遇到一些“警告信息(warning)”,警告信息可以忽略,不影響編譯。 [回到頂部](http://www.cnblogs.com/mjios/archive/2013/05/06/3062576.html#labelTop) ##三、鏈接程序 ### 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 ![](https://box.kancloud.cn/2016-05-07_572d6043a88d0.png) 鏈接成功后,會生成一個可執行文件,默認的名稱叫做“a.out”。由于我們是在mac系統下生成了可執行文件,mac系統是基于UNIX系統的,所以這個文件只能在UNIX系統中運行。如果是在Windows環境下,生成的可執行文件拓展名為".exe"。 ![](https://box.kancloud.cn/2016-05-07_572d6043bbad6.png) ?![](https://box.kancloud.cn/2016-05-07_572d6043d9dc2.png) ### 3.更改可執行文件的名稱 如果想更改可執行文件的名稱,可以輸入指令:cc -o one one.o,-o后面跟上可執行文件的名稱,因此可執行文件的名稱就變成了one ![](https://box.kancloud.cn/2016-05-07_572d6043eeab7.png) ![](https://box.kancloud.cn/2016-05-07_572d604414360.png) ### 4.連續執行編譯、鏈接 其實也可以在終端中直接輸入:cc one.c?, 會按順序執行編譯、鏈接兩個操作。 ![](https://box.kancloud.cn/2016-05-07_572d60442a1d1.png) 這條命令產生一個名為"a.out"的可執行程序。中間會產生一個名為one.o的目標文件,但它在鏈接完成后會被刪除。 ![](https://box.kancloud.cn/2016-05-07_572d60443e297.png) 如果想修改可執行文件的名稱,跟前面是一樣的,指令為:cc -o abc one.c?, 可執行文件的名稱為abc [回到頂部](http://www.cnblogs.com/mjios/archive/2013/05/06/3062576.html#labelTop) ##四、運行程序 經過前面幾個步驟后,終于生成了可執行文件,接下來就可以運行這個程序了。運行程序有2種方式: ### 1.在終端中輸入指令運行程序 在終端中輸入:./a.out,敲回車就可以運行這個程序。這里a.out是可執行文件的名稱。 ![](https://box.kancloud.cn/2016-05-07_572d604454678.png) 敲完指令后,你會發現屏幕上輸出了一句“Hello World”。就這樣,我們成功跟計算機來了一點小小的互動,它替我們輸出了一句文字。 ### 2.雙擊可執行文件 直接雙擊a.out文件,選擇用終端來運行程序 ![](https://box.kancloud.cn/2016-05-07_572d6044681fa.png) 運行成功后 ![](https://box.kancloud.cn/2016-05-07_572d60448d2d9.png) [回到頂部](http://www.cnblogs.com/mjios/archive/2013/05/06/3062576.html#labelTop) ##五、總結 經過一番折騰,終于將第一個C程序運行成功了,總共有4個步驟:編寫程序 -> 編譯 -> 鏈接 -> 運行 ![](https://box.kancloud.cn/2016-05-07_572d6044a69db.png) 需要注意的是: - 中間某個環節出錯了,那么就不會有后面的操作。比如編譯出錯了,那么就不可能有鏈接這個環節。 - 如果你對源代碼進行了修改,那么需要重新編譯、鏈接之后再運行程序,這樣才能看到最新的效果。 [回到頂部](http://www.cnblogs.com/mjios/archive/2013/05/06/3062576.html#labelTop) ##六、學習建議 ### 1.學編程并不是學英文 寫完這個Hello World程序后,可能很多人會去查單詞,看看int什么意思、看看那stdio、return又是什么意思。其實,這是非常沒必要的做法,我們學的是編程,并不是學英文,沒有必要一個一個詞語地去扣。再說,這些詞語對計算機來說并不是什么英文單詞,僅僅是個符號、是代碼!!!計算機只能識別0和1,因此還要將這些代碼編譯成0和1之后才能被計算機所執行。計算機并不是有道詞典,它不可能認識什么英文單詞。很多代碼都是固定寫法,并沒有太多的所謂英文含義。 ### 2.程序的可讀性 這個Hello World程序的功能很少,只有一丁點內容,我們就占用了好幾行行代碼。有人可能會問:這些代碼一定要換行么?第5行prinf語句的前面一定要要縮進幾個空格么? 其實,你完全可以不縮進 ~~~ #include <stdio.h> int main() { printf("Hello World\n"); return 0; } ~~~ 也可以將所有的代碼都寫成一行(第1行代碼比較特殊,必須獨立一行) ~~~ #include <stdio.h> int main() {printf("Hello World\n");return 0;} ~~~ 這樣寫雖然沒有問題,但是代碼可讀性非常地差,想象一下也知道:整個文件中就一行代碼,如果這個程序很大的話,肯定很多代碼,這樣的代碼是有多惡心啊!別人 可能根本看不太懂你寫的是什么東西,甚至你自己都看不太懂。在工作中,我們難免會遇到難題,經常要求助于他人,但是別人要在看得懂我們代碼的基礎上,才能 幫我們解決問題啊。因此,代碼的可讀性很重要!一定要養成良好的編程習慣。 ### 3.初學者不要過于尋根問底 當你對一門新技術還不是很了解的時候,你首先要做的事情是學會怎么使用它,先把它成功用起來,并不是從頭到尾看清楚所有的源代碼、把每一行代碼中的每個詞語都摸清楚什么意思,完全沒有這個必要。等你有一定的技術基礎了,這門技術用得很熟了,而且時間和能力允許的話,才有必要去尋根問底地解讀所有的源代碼。所以,第一個C程序的代碼中很多不懂的地方,暫時不用去糾結,學到后面了,你就會不自覺地就知道它們是什么意思了。 [回到頂部](http://www.cnblogs.com/mjios/archive/2013/05/06/3062576.html#labelTop) ##七、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的可執行文件
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看