上篇要點回顧和點評:
1、 上篇談了學習一門新語言要學會思考。請問,思考什麼?
2、 上篇談了編程流程,請問流程是什麼?
3、 你自己編了helloworld程序了嗎?一次編輯、編譯成功了嗎?
回答完了以上內容,請繼續下面的內容。
本篇將對Hello world 程序作深入的解析
我們學習語言,要有好的學習方法,這就是學習或編寫最少的語句,能達到對語言最佳的掌握。記住“最少”這兩字。實際中很多程序員沒有這個概念,能寫上上千萬萬行程序,但是對其語言依然掌握不透。這就因為他們頭腦裡只看到具體的語句,具體的功能,看不到“抽象的語句、抽象的功能”,不能掌握語言的規律和原理,不能掌握學習語言的方法和技巧,不能舉一反三。這些是新手們特別要注意的,千萬不要向他們學呀。
不知道大家對上篇的a.c能總結點啥。一定會有人說,不就是顯示一句helloworld嗎?是最簡單的程序了。我認同這是一個簡單的程序,而且大家的關注點都在顯示“hello world!”那一條語句上。但是,簡單不簡單,這個簡單的程序包含了很多重要的內容。每行都是寶,都有講頭,都少不了。
通過這個程序我們應該掌握什麼?
1、 一個完整的程序是什麼。
#include “stdio.h”
main()
{
fprintf(stdout,”hello world!\n”);
exit(0);
}
這就一個最簡單的完整程序,只有6行。但是它告訴我們,一個C語言是由兩個部分組成:定義和函數,至少有一個主函數。第一行#include “stdio.h”我們可以把它看做定義部分。第二行到第六行我們把它看做函數部分。知道這個組成有什麼用?我們就可以對我們以後編的程序進行評判了。如果我們的程序沒有定義,或沒有主函數則一定不是個完整的。有人會說,我就不需要定義,我說行,那只是一種例外,99.99%的應用C語言都是要有定義的。對於新手來說,我們先不學例外,我們先學些正常的。學了這個構成,我們在編寫C語言的時候,我們就會在想兩個問題:我們的定義是什麼?我們的函數是什麼?
先記住這兩個部分,今後我們還會對這兩個部分進行深入的分析,比如,定義部分再怎麼分,函數部分再怎麼分。
2、 程序的main
main這個函數也是一個語言的重要內容,有人會問,為啥必須要main函數?我寫個aaa函數不行嗎?如果你編寫的是一個可執行程序,那可能真的不行,運行這個程序必須有一個統一唯一的入口,而C語言的這個入口這就是main。不是嗎?如果沒有main,你在程序中編了a函數,b函數,程序怎麼知道先執行那個?是不是那個在前就先執行那個?那個在先,就先執行那個也是一種算法,但是,也有例外(今後會看到)。所以,人家規定了main為程序的入口是有它的道理的。
你跟他說main,他馬上會說知道了。是真的知道嗎?要真的掌握main的道理,就會在學習其他語言時候,就會有意識地去找相應的入口函數。比如,VFP中的load,C#窗體中的page_Load都是一個程序的最初的入口。
記住只要有多個函數必然就有一個主函數,找到主函數我們就可以進行最初的處理。比如初始化什麼的。
當然,隨著語言的發展,一些語言的主函數是可以通過用戶定義的了。但是,其原理還是不變的。
3、 程序的語法
大家老是說語法語法的,什麼是語法?語法就是語言的規定,是語言的法律,違背了這個規定,這個程序就玩不轉,就出錯。看來我們程序員編程也要受逃脫不了法制社會的約束呀。
1)#include “stdio.h”
意為包含文件,也是引用的意思。語法就是#include+“”+文件名。
如果,你把include 拼錯了、沒有加#、不是成對的雙引號、後面多加了分號。
則編譯通不過了,出錯了,違法了嘛。
2)main()
意為主函數,是程序的最先的入口。函數後面必須有一對刮號。如果你換了成大刮號,換成中刮號,或只有一個小刮號,或後面加了分號就不符合語法了,出錯了。函數後面是一對小刮號且沒有分號就是一個語法規定。
3){,}是函數體邊界符合,在此之內都屬於這個函數。不能少一個,多一個大刮號。
4、 函數的調用
編程序最常用的方法就是函數調用,函數調用就是避免重復編寫編碼,用現有的編碼。由於,C語言中的函數調用是不收費的,能調用還不調用?雖然這是一句調侃。但是,調用函數絕對是程序員最重要的任務之一,程序員不但要調系統函數,而且要調用他人的函數,更多的是要調用自己的函數。本程序有兩個函數調用:
1)fprintf(stdio,“hello world!\n”);
記住函數調用要掌握:函數名+參數+;這三個部分。
下次寫函數調用一定要記住呀。少一個都不行。這個真的要記住,記住了就會在調用函數時,或想調用函數時,考慮函數名是什麼?函數的參數是什麼?“;”是不是忘掉寫了。
在很多情況下,我們往往會注重前兩者,忘記“;” 結果編譯總是出錯。如果你是初學者,一定要把這基礎打好,在今後的編程中不要出現這個問題。
只是,當你學了不同的語言後,你往往會混淆,比如VFP中語句後面就沒有“;”。這個時候,你就會在VFP中加分號,在C語言不加分號,讓人哭笑不得。
2)exit(0);
這是一個退出程序的函數。有進必有出。有了出,你就可以在程序中隨時中斷處理,退出程序。退出函數也很重要,初學者也要牢記。參數中的0,表示程序返回值為0。在80%的情況下,程序的返回值是沒有什麼用的,我都處理完了,返啥都一個樣。但是,在一個大的項目中,在程序之間發生關系的時候,返回值就可能是一個重要的紐帶,那你就會要學會使用程序的返回值。好在我們後面的實戰中有這方面的例子。這裡你就會使用exit(0);就行了。一些老一點程序員會大喊,我不用exit(0),程序照樣退出來。是的,沒有exit(0),程序退出來的,但是,作為一個完整的程序而言,有進有出還是必須的。省了一條語句功能上應該沒啥問題,但是失去了可讀性了。還是加上exit(0)吧,正規的編寫,會產生好的習慣,而好的習慣會讓你更加正規。
5、 .h的引用
.h文件,往往是一個定義文件,定義一些常量、結構、外部數據,有些定義是有條件的。一般情況下,一個C語言至少要引用3個以上的系統文件。意為包含文件,也是引用的意思。從直白上來說,它將一部分源程序放到了外部了。這樣自己的源程序看起來更加簡潔。對於新手來說,#include 一般都包含一些系統的*.h 例如stdio.h 可讀作“標准io”。對以高手來說#include會包含一些自己的.h
#include 後面有“”,<> 兩種方式包含文件。一般用“”就行了。除非你不用<>不行。這裡我特地停下來談一下實用問題。學語言強調就是一個實用,不是讓你成為一個語言學家。就#include 而言,你掌握一種包含方法就行了,不必要弄清兩者的區別。因為,在你若干年之內,可以說,你是很難取一個和系統相同的.h文件的。如果,你非要學一個從系統目錄開始搜尋,一個從當前目錄開始搜尋差別有意義嗎?有意義的事多的去,就怕你沒有時間去學。
記住:
1)#include一般情況下引用的定義文件,在特殊情況下也可以引用函數文件。或定義與函數相結合的文件。
2)#include一般情況下引用的是系統的文件,在特殊的情況下,可以引用自己的定義文件和函數文件。
6、 關鍵字
程序雖然只有六行,但是,像include,main都是關鍵字。所謂關鍵字就是系統啟用的名字。你就不能起相同的名字了。比如,你就不能自己起一個名為main的函數。而今後,我們將會遇到更多的關鍵字,例如:if、else、while int char等等。有了這個初步的概念後,我們今後可以更加關注關鍵字,避免關鍵字。一般而言,水平越高的程序員,往往會碰到自己命名與系統命名重復的問題。因為他會越來越接近系統程序員,而新手則鮮有遇到這種情況。
7、轉義符
程序中fprintf(stdio,“hello world!\n”);中\n是很有意思的。
\n是換行的意思。n 可以記為new line.這樣就好記一些。在C語言中,一些不可顯示的控制字符,是通過轉意符加符號表示的。與\n一起的還有\r回車符(return)等。另外,一些關鍵字符\平常化,則要加\,例如\\表示\.
轉義符這個在C語言中也是比較重要的概念,也是常用的。
8、流的應用
程序中fprintf(stdio,“hello world!\n”);中的stdio是一個標准輸出,就是一個流。所謂流你可以把它看做一個渠道。這個渠道可以通往一個設備、一個文件,也可以通往下一個流。流是很有講頭的。內容很多,這裡運行這個程序流就顯示到屏幕上。
如果在命令行中輸入./a.out>1.txt
則屏幕上並不顯現hello world!, 而hello world!則產生到1.txt文件中去了。
在命令行接著輸入cat 1.txt
就可以看到hello world!了。
這說明流被改向到文件了。
如果,你沒有看到以上的歸納,你就能對新手講了以上的內容,說明你的基礎很好,反之,你只看到顯示hello world!這條語句怎麼寫,而無話可說,我只能說你需要加強基礎訓練,要改變自己的學習方法,多思考,多用最小的程序去思考。
如果有人要問,我已經會編hello world!下面我該編什麼?我建議去修改一下程序,顯示3遍hello world。到時候我會給程序做給評判。
本不想對hello world做深入的分析的,但是,你要成為高手,就要懂得萬丈高樓平地起的道理,我還是想借這個平地,將基礎的東西多講一講,基礎好才是真的好。
作者昵稱:n216