簡體   English   中英

main()函數的返回值轉換如何工作?

[英]how casting of return value of main() function works?

我正在使用Visual Studio2008。有關以下代碼

double main()
{
}

我得到錯誤:

錯誤C3874:“ main”的返回類型應為“ int”而不是“ double”

但是如果我使用下面的代碼

char main()
{
}

沒有錯誤。 運行並退出后,顯示輸出窗口

程序“ [5856] test2.exe:本機”已退出,代碼為-858993664(0xcccccc00)。

問題:編譯器是否將從默認返回值零(整數)隱式轉換為char?

代碼0xcccccc00是如何生成的?

看起來該代碼中的最后一個字節似乎是實際的返回值。 為什么0xcccccc來了?

按照C ++標准,正確的方法是:

int main()
{
...
}

不要將返回類型更改為其他任何類型,否則您的代碼將不是C ++,而您只是在使用編譯器特定的功能。 在您的示例中,這些ccccc值只是返回的單位字節(C分配器將其設置為0xCC)。

盡管C標准僅將特定含義賦予兩個值:EXIT_SUCCESS(傳統上為零)和EXIT_FAILURE,但從主函數返回的值變成了進程的退出狀態。 其他可能的返回值的含義是實現定義的。 但是,沒有關於如何解釋非零代碼的標准。

您可以參考有用的文章:

main()在C和C ++中應該返回什么?

另一個MSVC擴展/錯誤!

您第一個問題的答案是肯定的。 char本質上是一個非常小的整數類型,因此(極端)寬松的編譯器。 Double不是可接受的,因為它不是整數類型。 0xCCCCCC是從未初始化的內存(出於調試目的除外)。 由於ASCII字符只能有兩個十六進制數字,因此轉換根本無法設置前24位(僅將后8位設置為0)。 多么奇怪和令人討厭的編譯器技巧。

關於主函數,$ 3.6.1 / 2-“它的返回類型應該是int類型,否則它的類型是實現定義的。”

據我了解,標准文檔中提及“必須”且代碼未加注釋的任何內容都是編譯器需要診斷的即時條件,除非標准明確指出不需要這種診斷。

因此,我猜想VS如果允許這樣的代碼,就有一個bug。

main函數應該返回一個int。 不這樣做意味着您處於不確定的區域。 不要忘記在您過去的路上揮舞着標准。 您的char返回可能有用,因為char可以輕松轉換為int。 雙打肯定不能。 它們不僅更長(長度的兩倍),而且它們是浮點數,這意味着您在不穩定的地方將得到1。

簡短的答案:不要那樣做。

可能是因為char將隱式轉換為int,但是double不會,因為會丟失數據。

(有關更多信息,請參見此處: http : //msdn.microsoft.com/en-us/library/y5b434w4%28v=VS.71%29.aspx

但是,您不會看到轉換問題,因為編譯器會遇到使用非標准返回類型的最嚴重的錯誤(如其他答案所述)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM