為什麼這篇Int main鄉民發文收入到精華區:因為在Int main這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者tropical72 (藍影)看板C_and_CPP標題Re: [問題] main()的回傳值為...
※ 引述《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