推 jeunder:我記得main可以不用寫return, 這是standard規定. 61.64.150.151 08/24
→ randylau:7738 有寫到唷 140.113.22.24 08/24
推 sjgau:void main() { }// 不用 return() 210.243.237.65 08/24
→ sjgau:int main() { return(0); }// 需要 return() 210.243.237.65 08/24
推 jeunder:不, int main() { } // 就算不寫return也是被允 61.64.150.151 08/24
→ jeunder:許的... 這是standard規定的 :) 61.64.150.151 08/24
→ jeunder:在main裡, 不寫return就代表了return 0 61.64.150.151 08/24
→ jeunder:而 void main() { } 這種寫法根本上就是不合規範 61.64.150.151 08/24
推 amymayyam:是可以被允許 可是不知道好還是不好 218.164.85.148 08/24
推 amymayyam:想問的是 會不會傷環境 218.164.85.148 08/24
推 kakashiliu:void main() { }記得好像是不太好的寫法 61.58.173.56 08/24
推 UNARYvvv:void main 不好; main 沒 return 仍 imply回傳0 61.70.137.117 08/24
推 UNARYvvv:(int main的情況) 61.70.137.117 08/25
→ sekya:程式進入點可以找找crt0.S。 59.104.35.45 08/25
> -------------------------------------------------------------------------- <
作者: amymayyam (殘缺的愛) 看板: C_and_CPP
標題: Re: [討論] 有關main
時間: Wed Aug 24 17:08:38 2005
※ 引述《LPH66 (運命のルーレット廻して)》之銘言:
: main的return如同K大所說 是return給執行環境
: 另外 不知道你有沒有發現 main也是一個function 只是呼叫它的是系統
: 凡一個function宣告有回傳值 則函式中必須要有一個return回傳一個值
: 自然main該加上return
: 又凡function執行中 碰到return 則直接結束函式而回傳所要回傳的值
: 所以return要放在執行的最後(當然不是絕對啦)
: 因此你把get放在return後面 那個get就根本不會去執行
: main不用return是一部份compiler的變通寫法
: (像VC6不寫return會給過 但DJGPP就會叫)
: 只是到時候執行環境收到的回傳值是個莫名奇妙的值
: 自然很難判斷執行結果如何
: 所以還是習慣在main的最後加個return吧:)
: ---
: 題外話, get前面用cin.是表示這是cin的函式
: 它表示我們所get的東西在standard input之中
: 還有, 執行最後暫停和return是兩件不同的事 :)
可是return 0之後
程式就大功告成了(就是圓滿結束 掰掰的意思)
所以後面再加任何東西 他都不理你了吧?
個人有測試一個main呼叫main的程式
可是不知道對不對
#include <stdio.h>
#include <conio.h>
static int count=1;
main()
{
for(;;){
main();
count++;
if(getchar()=='q')
break;
}
return count;//回傳呼叫次數
printf("$d times.",count);//印出在按下結束鍵之前呼叫次數
getch();
return 0;
}
結果應該是有邏輯錯誤
所以雖然編譯過 可是看不到結果
--
220 除了本身以外的因數有:1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110
284 除了本身以外的因數有:1, 2, 4,71,142
而 220=1+2+4+71+142
284=1+2+4+5+10+11+20+22+44+55+110
它們彼此付出了自己的全部而化成了對方....
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.164.85.148
推 LPH66:那是因為你在return count;時就已經return了 219.84.44.21 08/24
→ LPH66:自然return以下的東西完全不會被執行 當然沒印結果 219.84.44.21 08/24
→ UNARYvvv:但我覺得這程式大概是造成了無窮遞迴耶.. 61.70.137.117 08/25
→ sekya:請不要利用main來做遞迴.. 59.104.35.45 08/25
→ godfat:無窮了啦,沒有跳離點… 61.216.0.106 08/26
> -------------------------------------------------------------------------- <
作者: khoguan (Khoguan Phuann) 看板: C_and_CPP
標題: Re: [討論] 有關main
時間: Wed Aug 24 19:50:21 2005
: 推 jeunder:我記得main可以不用寫return, 這是standard規定. 61.64.150.151 08/24
: → randylau:7738 有寫到唷 140.113.22.24 08/24
: 推 sjgau:void main() { }// 不用 return() 210.243.237.65 08/24
: → sjgau:int main() { return(0); }// 需要 return() 210.243.237.65 08/24
: 推 jeunder:不, int main() { } // 就算不寫return也是被允 61.64.150.151 08/24
: → jeunder:許的... 這是standard規定的 :) 61.64.150.151 08/24
: → jeunder:在main裡, 不寫return就代表了return 0 61.64.150.151 08/24
: → jeunder:而 void main() { } 這種寫法根本上就是不合規範 61.64.150.151 08/24
: 推 amymayyam:是可以被允許 可是不知道好還是不好 218.164.85.148 08/24
: 推 amymayyam:想問的是 會不會傷環境 218.164.85.148 08/24
: 推 kakashiliu:void main() { }記得好像是不太好的寫法 61.58.173.56 08/24
void main() { } 是早年 DOS 時代 MS 的編譯器就搞出來
不符標準的東西。因為多數人,包括英文、中文編程書籍的
作者,都在 MS 的淫威下討生活,所以就一直持續出現這種
寫法。
尤有甚者,即使標準說 int main() { } 不寫 return 0;
針對 main() 函式來說,就是要求編譯器自動幫我們在最後
補上 return 0; 這道敘述(但其他的函式就沒這種特權)。
MS 的編譯器卻不肯這樣做,還會多事警告你沒有 return,
讓很多人覺得刺眼,為了省事,就用 void main() { } 了。
我感到慶幸的是,我看的 C 或 C++ 書,沒有一本是寫
void main() 的,而且我以前也沒在用 MS 的 compiler,
現在是有在用 VC++ 7.1,不過 MS 變得比較重視標準了,
所以也沒有什麼問題(不過它還是繼續接受 void main()
的用法)。是因為看到別人提問,才去追蹤問題的根源。
對於初學者,我想建議說,如果你看的書,仍是寫 void main(),
你用的 C++ compiler 仍然對你寫 int main() { } 但沒寫 return
發出警告,那就換一本好書,換一套夠新夠符合標準的編譯
環境吧,網路都有免費的可用,不好好利用,豈不辜負了提
供這些寶藏的好人大大們? ;-)
特別是萬惡的罪魁 VC++ 6.0,或者是實在已經太古老的
Turbo C++,請初學者就不要再用了。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.130.208.168
推 kakashiliu:推薦這篇文章@@ 61.58.173.56 08/24
推 amymayyam:kh大跟ka大就是不一樣= = 218.164.85.148 08/24
推 khoguan:一樣的。大家都一樣有心想要學好 C 和 C++ 語言220.130.208.168 08/24
推 aufbu:推萬惡的VC6 註解會造成compile error的事情都遇過 203.73.81.31 08/24
推 UNARYvvv:請問樓上是哪種註解造成 VC6 編譯錯誤呢?? 61.70.137.117 08/24
推 khoguan:不好意思,我以後應該避免使用"淫威""萬惡罪魁"220.130.208.168 08/25
→ khoguan:這類強烈的形容詞來語出驚人.做人還是平實的好:)220.130.208.168 08/25
→ amymayyam:我覺得你們都很厲害耶 以後一定是很偉大的工程 218.164.85.148 08/25
→ amymayyam:師 我什麼都不懂 我怎麼可能變成大工程師呢 唉 218.164.85.148 08/25
> -------------------------------------------------------------------------- <
作者: freaky (jon) 看板: C_and_CPP
標題: Re: [討論] 有關main
時間: Wed Aug 24 23:21:09 2005
※ 引述《khoguan (Khoguan Phuann)》之銘言:
: void main() { } 是早年 DOS 時代 MS 的編譯器就搞出來
: 不符標準的東西。因為多數人,包括英文、中文編程書籍的
: 作者,都在 MS 的淫威下討生活,所以就一直持續出現這種
: 寫法。
請問這是那裡來的說法?
ISO C Standard 並未禁止 main() 的傳回值宣告成 int 以外的值,
只有 ISO C++ Standard 有這項規定; 而大部份的 compiler
都是 C/C++ 通吃, 因此有些實作允許 void main() 的寫法.
允許這種做法的也不只 MSVC, 還有 IBM VisualAge C/C++,
Watcom C/C++ 等.
: 尤有甚者,即使標準說 int main() { } 不寫 return 0;
: 針對 main() 函式來說,就是要求編譯器自動幫我們在最後
: 補上 return 0; 這道敘述(但其他的函式就沒這種特權)。
: MS 的編譯器卻不肯這樣做,還會多事警告你沒有 return,
: 讓很多人覺得刺眼,為了省事,就用 void main() { } 了。
: 我感到慶幸的是,我看的 C 或 C++ 書,沒有一本是寫
: void main() 的,而且我以前也沒在用 MS 的 compiler,
: 現在是有在用 VC++ 7.1,不過 MS 變得比較重視標準了,
: 所以也沒有什麼問題(不過它還是繼續接受 void main()
: 的用法)。是因為看到別人提問,才去追蹤問題的根源。
: 對於初學者,我想建議說,如果你看的書,仍是寫 void main(),
: 你用的 C++ compiler 仍然對你寫 int main() { } 但沒寫 return
: 發出警告,那就換一本好書,換一套夠新夠符合標準的編譯
: 環境吧,網路都有免費的可用,不好好利用,豈不辜負了提
: 供這些寶藏的好人大大們? ;-)
: 特別是萬惡的罪魁 VC++ 6.0,或者是實在已經太古老的
: Turbo C++,請初學者就不要再用了。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.70.36.38
> -------------------------------------------------------------------------- <
作者: khoguan (Khoguan Phuann) 看板: C_and_CPP
標題: Re: [討論] 有關main
時間: Wed Aug 24 23:49:03 2005
※ 引述《freaky (jon)》之銘言:
: ※ 引述《khoguan (Khoguan Phuann)》之銘言:
: : void main() { } 是早年 DOS 時代 MS 的編譯器就搞出來
: : 不符標準的東西。因為多數人,包括英文、中文編程書籍的
: : 作者,都在 MS 的淫威下討生活,所以就一直持續出現這種
: : 寫法。
: 請問這是那裡來的說法?
: ISO C Standard 並未禁止 main() 的傳回值宣告成 int 以外的值,
: 只有 ISO C++ Standard 有這項規定; 而大部份的 compiler
: 都是 C/C++ 通吃, 因此有些實作允許 void main() 的寫法.
: 允許這種做法的也不只 MSVC, 還有 IBM VisualAge C/C++,
: Watcom C/C++ 等.
請先參考 C FAQ 這兩則:
http://www.eskimo.com/~scs/C-faq/q11.12.html
http://www.eskimo.com/~scs/C-faq/q11.14.html
我說它不符標準的意思是說,只有將 main() 的傳回值宣告成 int
才是 blessed by the standard and guaranteed to be portable
for any conforming C (or C++) implementation.
至於 void main() 的始作俑者,我是在 comp.lang.c* 上看到
人家說是 MS 搞出來的。請讓我再找一下有無更權威的證據。
BTW, 你所舉的實作也都是限於 MS 平台的。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
※ 編輯: khoguan 來自: 220.130.208.168 (08/25 00:02)
推 hardcover:建議不要讓對平台的偏執延燒到的程式語言 XD 59.113.86.189 08/25
→ hardcover:不然嘴砲文會和 linux板一樣多 XD 59.113.86.189 08/25
推 khoguan:謝謝樓上的提醒。220.130.208.168 08/25
> -------------------------------------------------------------------------- <
作者: freaky (jon) 看板: C_and_CPP
標題: Re: [討論] 有關main
時間: Thu Aug 25 00:10:47 2005
※ 引述《khoguan (Khoguan Phuann)》之銘言:
: ※ 引述《freaky (jon)》之銘言:
: : 請問這是那裡來的說法?
: : ISO C Standard 並未禁止 main() 的傳回值宣告成 int 以外的值,
: : 只有 ISO C++ Standard 有這項規定; 而大部份的 compiler
: : 都是 C/C++ 通吃, 因此有些實作允許 void main() 的寫法.
: : 允許這種做法的也不只 MSVC, 還有 IBM VisualAge C/C++,
: : Watcom C/C++ 等.
: 請先參考 C FAQ 這兩條:
: http://www.eskimo.com/~scs/C-faq/q11.12.html
: http://www.eskimo.com/~scs/C-faq/q11.14.html
: 我說它不符標準的意思是說,只有將 main() 的傳回值宣告成 int
: 才是 blessed by the standard and guaranteed to be portable
: for any conforming C or C++ implementation.
FAQ 並非標準, 請參考 ISO C Standard 5.1.2.2.1.1:
The function called at program startup is named main. The
implementation declares no prototype for this function.
It shall be defined with a return type of int and with no
parameters [...] or with two parameters [...] or equivalent;
or in some other implementation-defined manner.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
另外還有 5.1.2.2.3.1:
[...] If the return type is not compatible with int, the
termination status returned to the host environment is
unspecified.
顯然目前 ISO C Standard 允許這個後門存在.
: 至於 void main() 的始作俑者,我是在 comp.lang.c* 上看到
: 人家說是 MS 搞出來的。請讓我再找一下有無更權威的證據。
: BTW, 你所舉的實作也都是限於 MS 平台的。
然後? 是 MS 實作 IBM VisualAge C/C++ 嗎?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.70.36.38
> -------------------------------------------------------------------------- <
作者: UNARYvvv (有趣生活) 看板: C_and_CPP
標題: Re: [討論] 有關main
時間: Thu Aug 25 00:12:03 2005
※ 引述《amymayyam (殘缺的愛)》之銘言:
: 可是return 0之後
: 程式就大功告成了(就是圓滿結束 掰掰的意思)
: 所以後面再加任何東西 他都不理你了吧?
: 個人有測試一個main呼叫main的程式
: 可是不知道對不對
: #include <stdio.h>
: #include <conio.h>
: static int count=1;
: main()
: {
: for(;;){
: main();
└→ main()
{
for(;;){
main();
└→ main()
{
for(;;){
main();
└→ main()
....................
[stack overflow]
所以這程式做的事情
大概只有一直自我遞迴,直到堆疊爆掉為止
而後面的敘述,也就全部都沒機會被執行囉..
: count++;
: if(getchar()=='q')
: break;
: }
: return count;//回傳呼叫次數
: printf("$d times.",count);//印出在按下結束鍵之前呼叫次數
: getch();
: return 0;
: }
: 結果應該是有邏輯錯誤
當然 :)
: 所以雖然編譯過 可是看不到結果
這個程式
用 DevCpp 編出來的執行檔大概跑一跑就會直接掛
堆疊爆了可能也不會顯示任何錯誤訊息
所以情況就像是什麼結果都沒有
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.70.137.117
→ amymayyam:我的dev還好ㄋㄟ 它直接程式關掉 每次我寫錯的 218.164.85.148 08/25
→ amymayyam:時候 他都直接關 不管我用了什麼停止指令 218.164.85.148 08/25
→ UNARYvvv:這就是我的意思啦~ 就是看起來什麼都沒發生 61.70.137.117 08/26
> -------------------------------------------------------------------------- <
作者: khoguan (Khoguan Phuann) 看板: C_and_CPP
標題: Re: [討論] 有關main
時間: Thu Aug 25 02:35:30 2005
※ 引述《freaky (jon)》之銘言:
: FAQ 並非標準, 請參考 ISO C Standard 5.1.2.2.1.1:
C FAQ (copyright 1995)所遵循的是 C89/90 標準,
而非以下所引的 C99 條文。
: The function called at program startup is named main. The
: implementation declares no prototype for this function.
: It shall be defined with a return type of int and with no
: parameters [...] or with two parameters [...] or equivalent;
: or in some other implementation-defined manner.
: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
: 另外還有 5.1.2.2.3.1:
: [...] If the return type is not compatible with int, the
: termination status returned to the host environment is
: unspecified.
: 顯然目前 ISO C Standard 允許這個後門存在.
容許是容許,但既然是 implementation-defined 那就能不用就不用。
因為使用 implementation-defined feature 的程式就不是
strictly conforming program 了。
: : 至於 void main() 的始作俑者,我是在 comp.lang.c* 上看到
: : 人家說是 MS 搞出來的。請讓我再找一下有無更權威的證據。
: : BTW, 你所舉的實作也都是限於 MS 平台的。
: 然後? 是 MS 實作 IBM VisualAge C/C++ 嗎?
然後,就是我所強調的,將 void 改成 int,確保具有最大的
可移植性,也就是寫成 int main() { /*...*/ return 0; }
而不是只能在 MS 平台上正常執行。
你所引用的 ISO C 條文,是 C99 的,雖然它已出了好幾年,
但大家還是以 C89/90 為主,完全符合 C99 的 compiler 也
不普遍。C89/90 對於 main 不傳回 int 的做法是 undefined
behavior[註],也就是說不傳回 int 是不對的。
Anyway, 我之前說的「不符標準」,未能充份考究 C 的最新標準
與舊標準還有 C++標準彼此間出入的地方,謝謝你的指正。
[註] 關於這點,我並沒有 C89 的原文可做確認(我只有 C99的,
C89 只有昂貴的紙本,不易取得),而是根據 comp.lang.c
上的討論:
縮址:http://myurl.com.tw/fq6d
原址:
http://groups.google.com.tw/group/comp.lang.c/browse_thread/thread/
e8004d31ce9cd032/73a45e2194f42369?q=main+return+type+void&hl=zh-TW&
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.130.208.168