我懷疑爲什麼會發生這樣的情況:不同的編譯器會給同一個C程序提供不同的輸出。如果存在標準C,那麼爲什麼這些着名的編譯器不會完全使用它。 輸出的差異是由16位32位編譯器引起的,所以這些問題會導致差異。爲什麼不同的C編譯器爲C程序提供不同的輸出?
回答
語言標準爲實現留下了幾個自由度。首先,即使程序正確執行,其行爲可能依賴於實現定義的語言功能。例如,對於基本整數類型,不同的實現可以具有不同的範圍。
其次,程序可能會被打破。在這種情況下,一個破碎的程序是依賴於未定義或未被該語言指定的行爲的程序。該計劃似乎以某種方式「發揮作用」,但其實際行爲將取決於不可預測的因素,因此將不一致。
實踐表明,在許多(如果不是大多數)情況下,當人們抱怨行爲不一致的C程序,它們實際上沒有意識到,他們正在處理一個破碎的程序。
你有例子嗎?
的語言規範,但它的很多方面都實現定義甚至是不確定的。
例如,這樣的:
printf("sizeof (int) = %u\n", (unsigned)sizeof (int));
將在不同系統上打印不同的數字,這取決於int
有多大。
在大多數情況下,它當程序員使用了未定義行爲和編譯器來嘗試猜你的意思是。
的另一個潛在問題的例子:C++ 0x中剛剛得到批准,但並未公開提供的最終草案。只要它變得可用,一些編譯器可能會在其他人之前添加支持。
解決方案的一部分:許多編譯器都有一種方法來編譯到某個規範。例如,對於GCC,您可以使用「gcc programname.c -ansi」進行編譯,以確保您的代碼符合ANSI標準。這將確保一致性。
C中有很多東西是實現定義的。這意味着創建編譯器的人可以選擇他們想要如何處理這些情況。一般來說,爲了便於攜帶,在大多數情況下最好不要依賴未定義的行爲,即使大多數或所有編譯器都以相同的方式處理它。如果你提供了一些不同的編譯器對待不同的代碼,也許我們可以告訴你他們爲什麼這樣做以及如何解決它。
未定義行爲的一個例子是引用一個未初始化的變量是這樣的:
int *a;
printf("%d", *a);
在大多數實現中,你會看到一些垃圾整數,這並不意味着任何東西(一個警告一起)。無論存儲在a
指向的內存位置中的值是什麼,然而,在技術上,實現可能已經指定引用一個未初始化的變量總是會給0(或類似的東西)。原因並非如此,因爲實施起來要困難得多。儘管如此,你仍然不應該指望在a
指向的內存位置發生任何事情。它可能會或可能不是你得到的。
- 1. 爲什麼Visual C++和g ++爲我的程序提供不同的輸出?
- 2. 針對不同編譯器的不同輸出 - C和C++
- 3. 爲什麼onclick監聽器會提供不同的輸出?
- 4. 爲什麼console.log和document.write爲相同的代碼提供不同的輸出?
- 5. 爲什麼此程序的輸出在C和C++之間不同?
- 6. 調試和編譯C++程序後的不同輸出
- 7. 爲什麼輸出不同?
- 8. 爲什麼下面的程序在C++中給出不同的輸出?
- 9. 爲什麼操作員爲不可變對象提供不同的輸出?
- 10. C/C++不確定值:編譯器優化提供了不同的輸出(示例)
- 11. OpenMP C和C++ cout/printf不提供相同的輸出
- 12. 獲取不同的C程序輸出?這個程序輸出什麼?
- 13. 不同的打印輸出(C程序)
- 14. 爲什麼它會爲每個值提供相同的輸出?
- 15. 爲什麼我在C++中獲得不同的輸出?
- 16. 爲什麼這個C++程序編譯?
- 17. 爲什麼編譯器不提供默認的operator =模板類?
- 18. 爲什麼我的程序在使用不同的編輯器和編譯器時會有所不同?
- 19. 爲什麼我的opengl freeglut應用程序編譯爲C而不是C++?
- 20. 編譯器之間的不同輸出
- 21. 不同的C編譯器給出不同的結果合併排序
- 22. 爲什麼不能編譯這個簡單的c程序?
- 23. 爲什麼我的C++除法程序不能編譯
- 24. 爲什麼下面的代碼爲不同的執行提供不同的輸出
- 25. 爲什麼多次運行CoffeeScript編譯器會產生不同的輸出?
- 26. Windows和Linux之間的程序輸出不同。爲什麼?
- 27. 爲什麼Erlang的驅動程序輸出與預期不同?
- 28. 不同的編譯器,不同的輸出?
- 29. 爲什麼我會從這個代碼的不同編譯器得到不同的輸出結果?
- 30. 爲什麼realloc()在爲C++編譯時神祕地行爲不同?
也許如果你發佈了導致不同編譯器給出不同結果的確切代碼,我們可以告訴你爲什麼。你的邏輯很可能是錯誤的。 – Daniel
在不同的編譯器上試試這個:a = a ++ + ++ a; –