我想為SO準備一些教育工具,該工具應幫助初學者(和中級)程序員認識和挑戰C,C ++及其平臺中的不必要假設。例子:“整數環繞”“每個人都有ASCII”“我可以將函數指針存儲在void *中”我認為一個小的測試程序可以在各種平臺上運行,這些平臺運行“合理”的假設,這些假設是根據我們在SO中的經驗得出的,通常是由許多沒有經驗/半經驗的主流開發人員做出的,并記錄了它們在不同機器上的破壞方式。這樣做的目的不是為了證明做某事是“安全的”(這是不可能做到的,如果測試失敗則只能證明任何事情),而是向即使是最無知的人也演示最不起眼的表情如果其他計算機具有未定義或實現定義的行為,則在另一臺計算機上中斷。。為此,我想問你:如何改善這個想法?哪些測試會很好,并且看起來會如何?您是否可以在可以使用的平臺上運行測試并發布結果,以便最終獲得平臺數據庫,它們之間的差異以及為何允許這種差異?我從一開始就制作了這個社區Wiki,因為我認為人們在閱讀本文時想編輯我的笨拙。更新感謝您的輸入。我從您的答案中添加了一些案例,將看看是否可以像Greg建議的那樣為此設置一個github。更新:我為此創建了一個github存儲庫,文件為“ gotcha.c”:http://github.com/lutherblissett/disenchanter請在此處回答補丁或新想法,以便在此處進行討論或澄清。然后,我將它們合并到gotcha.c中。
3 回答

Smart貓小萌
TA貢獻1911條經驗 獲得超7個贊
子表達式的評估順序,包括
函數調用的參數和
運營商(例如,操作數+,-,=,*,/),以下除外:
二進制邏輯運算符(&&和||),
三元條件運算符(?:),以及
逗號運算符(,)
是未指定
例如
int Hello()
{
return printf("Hello"); /* printf() returns the number of
characters successfully printed by it
*/
}
int World()
{
return printf("World !");
}
int main()
{
int a = Hello() + World(); //might print Hello World! or World! Hello
/** ^
|
Functions can be called in either order
**/
return 0;
}
- 3 回答
- 0 關注
- 633 瀏覽
添加回答
舉報
0/150
提交
取消