看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《falconlegend (獵鷹)》之銘言: : 1 : 1 : 請問int main(int argc,char*argv[]) : 最前面的int是啥麼作用 : $$1 要講 main 傳回值時,勢必從 main 裡開始細解。 早期可接受的 main 有 void main(int argc, char **argv); void main(void); int main(int argc, char **argv); int main(void); 忘了從哪裡開始,標準規定所有的 main 一定只能可傳回 int,也就是只剩兩個 int main(int argc, char**argv); int main(void); 其它的一些特定 os 或特定 compiler ,可能會看到 int main(int argc, char **argv, char **envp); int main(int argc, char **argv, char **envp, char **apple); 上面兩個就暫時別理它。 --- 往下說之前, http://edisonx.pixnet.net/blog/post/57060736 這份網頁,一字一字從頭看到 3. 進行程式碼測試 結束並實作,再看接下來的東西。 如果上面連結,或下面說明看不懂的話,代表還不是時候了解這問題。 或許等學到 function 時再回來看好些 (除非你已有其他程式語言經驗) --- 傳回值在上一篇,purpose 大有提過,它是要告訴作業系統, 這份程式已經結束了,怎麼結束的?正常執行結束?莫名奇妙結束? 人為直接關閉結束?不管怎麼結束,你要怎麼告訴作業系統? 不可能是直接存說 "程式正常結束"、"程式被使用者中斷"、"程式莫名奇妙結束"... etc, 這些原因,都存放在一個作業系統的變數 (環境變數) 裡面,而這變數, 目前都是以「整數」來表示,所以是 int,不會是「小數點」float, 也不會是「字串」string / char* 。 於是,在自己寫的程式, main ,最後一定要告訴作業系統,這個程式是 怎麼結束的,所以回傳 int。 而在 Windows 作業系統裡面,要知道程式的傳回值,是去看 ERRORLEVEL, 在 Linux 系列裡面,是去看 $? ,這裡一堆廢話,都是 purpose 剛三行就講完的。 --- 現在我寫一份簡單的程式,內容是將輸入的兩個引數做除法動作, 假設生成 div.exe 正常的呼叫是長這樣 div.exe 1 2,共 3 個引數, 欲設計之 main 的傳回值如下敘述: 0 : 成功 1 : 輸入參數過多,如 div.exe 1 2 3 2 : 輸入參數不足,如 div.exe 3 : 分母為零,如 div.exe 1 0 4 : 其它可能未定義之錯誤。 程式碼大致如下 /* filename : div.c */ #include <stdio.h> #include <stdlib.h> #define SUCCESS 0 /* 成功 */ #define PARAM_OVER 1 /* 參數過多 */ #define PARAM_LSS 2 /* 參數不足 */ #define Q_ZERO 3 /* 分母為零 */ #define OTHER_FAIL 4 /* 其它未定義失敗 */ int main(int argc, char **argv) { int a, b; if(argc==3) { // 引數剛好為 3 a=atoi(argv[1]), b=atoi(argv[2]); if(b==0) return Q_ZERO; // 分母為 0, 傳回 3 else { // 分母不為 0 printf("%d/%d=%d", a, b, a/b); return SUCCESS; // 成功,傳回 0 } } else if(argc>3) return PARAM_OVER; // 參數過多 else if(argc<3) return PARAM_LSS; // 參數不足 else return OTHER_FAIL; // 其它未定義失敗 } --- 產生 div.exe 後,放到 C:\ 下,開啟你的命令提示字元 (WinKey+R, cmd.exe), 切到 C:\ 根目錄底下,進行以下操作。 1. 正常輸入情況 C:\> div.exe 10 2 10/2=5 (正常輸出) C:\> echo %ERRORLEVEL% (馬上輸入這指令進去) 0 (因 div.exe 程式裡面正常執行完,傳回 SUCCESS,即0) 2. 多一個參數情況 C:\> div.exe 10 2 1 (沒有輸出,因錯誤在 div.exe 裡面就沒輸出) C:\> echo %ERRORLEVEL% (馬上輸入這指令進去) 1 (div.exe 程式執行完,傳回 PARAM_OVER,即 1) 3. 少一個參數情況 C:\> div.exe 10 (沒有輸出,因錯誤在 div.exe 裡面就沒輸出) C:\> echo %ERRORLEVEL% (馬上輸入這指令進去) 2 (div.exe 程式執行完,傳回 PARAM_LSS,即 2) 最後一個狀況除0讓你自己試。 --- 到這裡基本上對於程式傳回值大概有一定了解,但這可以幹嘛? 我只能說如果沒有寫 shell、batch 的話,對它並不會太有認知好用在哪, 可以試想一下,假設你寫了一個 C 語言 (或其他可以傳回變數的程式語言), 拿給寫批次檔的人用,但別人用了可能不知道成功或失敗, 即使失敗了,也會想知道原因。對寫批次檔的人而言,最方便查看錯誤碼的方式, 就是去看 ErrorLevel、$? ,故在主程式 main 那裡的 return value, 是有意義的。 如果看不懂什麼叫 return value,那就別鑽牛角尖了,先往下 K 熟就好, 這部份也是一堆人和我一樣,一知半解,程式還不是寫得好好、人還不是活得好好的。 -- 20110917 23:01 修錯字 - echo %ERROREVEL% --> echo %ERRORLEVEL% 20120315 修 C 語言程式碼筆誤 -- YouLoveMe() ? LetItBe() : LetMeFree(); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.78.41
xatier:用心推! 09/16 23:30
liymars:大推! 09/17 01:02
VictorTom:推! 09/17 01:21
ppaass:用心推! 09/17 01:23
autoupdate:感謝你 收穫很多 09/17 01:37
angleevil:有好人,快拜 09/17 07:32
pandajohn:好用心,而且觀念好清楚...神人 09/17 11:31
kingweirong:大推!! 09/22 11:43
※ 編輯: tropical72 來自: 123.195.165.40 (03/15 20:11)