c的設計原則是把函式作為程式的構成模組。main()函式稱之為主函式,乙個c程式總是從main()函式開始執行的。
一、main()函式的形式
在最新的 c99 標準中,只有以下兩種定義方式是正確的:
int main( void )--無引數形式
int main( int argc, char *argv )--帶引數形式
int指明了main()函式的返回型別,函式名後面的圓括號一般包含傳遞給函式的資訊。void表示沒有給函式傳遞引數。關於帶引數的形式,我們等會討論。
瀏覽老版本的c**,將會發現程式常常以
main()
這種形式開始。c90標準允許這種形式,但是c99標準不允許。因此即使你當前的編譯器允許,也不要這麼寫。
你還可能看到過另一種形式:
void main()
有些編譯器允許這種形式,但是還沒有任何標準考慮接受它。c++ 之父 bjarne stroustrup 在他的主頁上的 faq 中明確地表示:void main( ) 的定義從來就不存在於 c++ 或者 c 。所以,編譯器不必接受這種形式,並且很多編譯器也不允許這麼寫。
堅持使用標準的意義在於:當你把程式從乙個編譯器移到另乙個編譯器時,照樣能正常執行。
二、main()函式的返回值
從前面我們知道main()函式的返回值型別是int型的,而程式最後的 return 0; 正與之遙相呼應,0就是main()函式的返回值。那麼這個0返回到那裡呢?返回給作業系統,表示程式正常退出。因為return語句通常寫在程式的最後,不管返回什麼值,只要到達這一步,說明程式已經執行完畢。而return的作用不僅在於返回乙個值,還在於結束函式。
現在我們來做乙個小試驗(注意:本人的系統是windows xp, 編譯環境是tc)來觀察main()函式的返回值。編寫如下**並編譯執行:
#include "stdio.h"
int main(void)
將這個檔案儲存為a.c,編譯執行後會生成乙個a.exe檔案。現在開啟命令提示符,在命令列裡執行剛才編譯好的可執行檔案,然後輸入 echo %errorlevel% ,回車,就可以看到程式返回 乙個0 。如果把 return 0; 改為 return 99; ,那麼很顯然,再次執行上述步驟以後你可以看到程式返回99。要是你這樣寫 return 99.99; 那還是返回99,因為99.99被傳給作業系統之前,被強制型別轉換成整數型別了。
現在,我們把a.c改回原來的**,然後再編寫另乙個程式b.c:
#include "stdio.h"
int main(void)
編譯執行後開啟命令提示符,在命令列裡輸入a&&b 回車,這樣你就可以看到《人鬼情未了》裡面經典的愛情對白:
i love you.
i'm too.
&& 的含義是:如果 && 前面的程式正常退出,則繼續執行 && 後面的程式,否則不執行。所以,要是把a.c裡面的 return 0; 刪除或者改為 return 99; ,那麼你只能看到 i love you. 。也就是說,程式b.c就不執行了。現在,大家該明白 return 0; 的作用了吧。
三、main()函式的引數
c編譯器允許main()函式沒有引數,或者有兩個引數(有些實現允許更多的引數,但這只是對標準的擴充套件)。這兩個引數,乙個是int型別,乙個是字串型別。第乙個引數是命令列中的字串數。按照慣例(但不是必須的),這個int引數被稱為argc(argument count)。大家或許現在才明白這個形參為什麼要取這麼個奇怪的名字吧,呵呵!至於英文的意思,自己查字典吧。第二個引數是乙個指向字串的指標陣列。命令列中的每個字串被儲存到記憶體中,並且分配乙個指標指向它。按照慣例,這個指標陣列被稱為argv(argument value)。系統使用空格把各個字串格開。一般情況下,把程式本身的名字賦值給argv[0],接著,把最後的第乙個字串賦給argv[1],等等。
現在我們來看乙個例子:
#include "stdio.h"
int main(int argc, char *argv)
編譯執行,開啟命令列並輸入d love.txt 回車。這樣,開啟d.c檔案所在的目錄,你會發現多了乙個名為 love.txt 的檔案,開啟後裡面的內容正是世界上說的最多的那句話。
當然,你可能會說我不需要使用命令列引數就可以做到這些。是的,你當然可以。使用命令列引數的理由或許就是練習命令列用法,以備以後需要編寫基於命令列的程式。還有乙個好處是,不需要c環境就可以執行已經編譯好的程式。比如,你把上面那個程式編譯後生成的d.exe發給你的女朋友,再告訴她怎麼執行,這樣,你的女朋友可以用另一種方式體會到你對她的濃情蜜意。
公開的函式把函式作為引數
公開的函式把函式作為引數 假設想公開把其它的函式作為引數的函式。最好的方法是用託付 delegate 考慮以下的樣例。定義了兩個函式,乙個是公開函式,還有乙個把函式公開為託付。module strangelights.demomoduleopen system a function that pro...
Android 架構設計的思想與原則是什麼?
引用些經典分析,拋玉引玉吧 rlei分析了android的設計哲學 理解好intent,就可以理解android哲學 所有應用生來平等 的一部分。舉個簡單的例子,ios裡面應用要整合sns如facebook twitter sina weibo等,都需要應用自己實現 ios5也只是整合twitter...
C 的設計原則
c 設計成靜態型別 和c同樣高效且可移植的多用途程式語言。c 設計成直接的和廣泛的支援多種程式設計風格 程式化程式設計 資料抽象化 物件導向程式設計 泛型程式設計 c 設計成給程式設計者更多的選擇,即使可能導致程式設計者選擇錯誤。c 設計成盡可能與c相容,籍此提供乙個從c到c 的平滑過渡。c 避免平...