原則上說,我們應該講道理,不是講規則。對main()函數要返回值,返回0的時候,大家都沒有任何問題,但問題是如果真的要返回非零,應該返回什麼?你說打開文件失敗,返回-1還是1?好的,假設你說,應該返回-1,那麼操作系統是否認可你返回的-1意味著打開文件失敗?你有跟操作系統簽訂這類錯誤碼協議嗎?操作系統有規定你什麼錯誤返回什麼碼嗎?事實是沒有!那麼,你除了零之外,還能夠返回什麼?如果都是零,規定不規定又有什麼關係呢。Windows系統有數萬條內部錯誤碼(我們不可能全部都熟悉,何況那個碼表是會變化的),但仍然有保留空間給用戶自定義錯誤碼,那部分自定義的代碼,就是操作系統無法處理的,你返回給它,也是沒用,因為它根本就不知道那是什麼意思。只有在我們編排操作系統,如果這個程序返回什麼那麼就接著做什麼,那這種返回碼才是有用的,此時相當於程序未完成,接著寫,調用別的模塊而已,還是返回在程序內部寫函數的模式,因此main()的返回本質上跟普通函數的返回是一樣的,這就是1樓那句話的意思。
雖然我沒看過C89或C99的文本,但照道理上說,main()有返回值,應該只是“推薦”或“建議”級別,而不是“必須”,更不是“禁止(不返回)”。void main(void)並不是錯誤,不必總盯著這個來說。其實,這個規定也是違反C語言常規的,0在C語言中意味著假(false),但在這裡卻表示成功(true),意義完全相反,在Windows API函數,才會用==0表示成功,也用BOOL TRUE值表示成功,最好避免用if(*p)之類,用if(*p!='\0')更好。因此,糾纏這樣的問題,不是挺搞笑的嗎?如果C99那麼重視main()的返回值,何必引入bool類型,傳統C就能處理的了。
[ 本帖最后由 TonyDeng 于 2012-3-1 14:00 编辑 ]
雖然我沒看過C89或C99的文本,但照道理上說,main()有返回值,應該只是“推薦”或“建議”級別,而不是“必須”,更不是“禁止(不返回)”。void main(void)並不是錯誤,不必總盯著這個來說。其實,這個規定也是違反C語言常規的,0在C語言中意味著假(false),但在這裡卻表示成功(true),意義完全相反,在Windows API函數,才會用==0表示成功,也用BOOL TRUE值表示成功,最好避免用if(*p)之類,用if(*p!='\0')更好。因此,糾纏這樣的問題,不是挺搞笑的嗎?如果C99那麼重視main()的返回值,何必引入bool類型,傳統C就能處理的了。
[ 本帖最后由 TonyDeng 于 2012-3-1 14:00 编辑 ]
授人以渔,不授人以鱼。