精華區beta C_and_CPP 關於我們 聯絡資訊
: → amymayyam:return 0要去掉比較好.... 218.164.85.148 08/24 : → amymayyam:我忘了get()要用在return前還後 可是return沒 218.164.85.148 08/24 : → amymayyam:加 應該也可以compile過 而且就會延遲關視窗了 218.164.85.148 08/24 : → amymayyam:個人心得啦 參考看看 218.164.85.148 08/24 : → khoguan:給amy小妹:不要建議人家說return 0;去掉比較好啦 220.130.208.168 08/24 : → khoguan:是可以去掉,但不是比較好。 220.130.208.168 08/24 : 推 amymayyam:因為他就在main裡面 而且沒有其他函式 218.164.85.148 08/24 : → amymayyam:要return什麼啦 像這種case去掉比較不會讓電腦 218.164.85.148 08/24 : → amymayyam:跟我一樣想不通 我是這樣覺得 218.164.85.148 08/24 : → amymayyam:我自己的經驗 後面加個return 0它都會關掉 218.164.85.148 08/24 : → amymayyam:我的電腦脾氣比較快= = 218.164.85.148 08/24 : → amymayyam:怪 218.164.85.148 08/24 : 推 khoguan:妳的電腦跟妳一樣好有個性哦 XD 220.130.208.168 08/24 : → khoguan:main中return是return給執行環境.另參考7738篇 220.130.208.168 08/24 : 推 amymayyam:retun 0要放的話 要放最後面 畫面才會停 218.164.85.148 08/24 : → amymayyam:剛剛試過的 218.164.85.148 08/24 : → amymayyam:為什麼get()前面要加cin.? 218.164.85.148 08/24 : → amymayyam:因為前面給他加return 0真的會關掉咩 218.164.85.148 08/24 : → amymayyam:既然不加 沒有嚴重後果 邏輯上 可以接受 218.164.85.148 08/24 : → amymayyam:每次都加 會搞混吧 218.164.85.148 08/24 : → amymayyam:我是可以不加就不加 反正我的編譯器 跟我一樣 218.164.85.148 08/24 : 推 amymayyam:你上面寫了 main可以不用return嘛= = 218.164.85.148 08/24 : → amymayyam:因為我老是忘了要加在前面還是後面 所以乾脆省 218.164.85.148 08/24 : → amymayyam:略嘛= = 當然如果有函式 除非不接受回傳值 218.164.85.148 08/24 : → amymayyam:我習慣會加 return我也是花很多時間才搞懂 218.164.85.148 08/24 : 推 amymayyam:沒有function 所以不用加return<=這不是正確的 218.164.85.148 08/24 : → amymayyam:觀念嗎? 為什麼都沒看到? 我是這樣說 218.164.85.148 08/24 : → amymayyam:我程式也不是隨便寫寫= = 218.164.85.148 08/24 : → amymayyam:不過給未來的版主大大指正 蠻榮幸的 218.164.85.148 08/24 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是兩件不同的事 :) -- "LPH" is for "Let Program Heal us".... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.84.44.21
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