看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《pinkkate (笑笑貓~)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : gcc : 問題(Question): : 這是某間公司的考題 : char *test = "ABCDE"; : *test++; : printf("%s\n", test); : test++; : printf("%s\n", test); : 問輸出結果 : -------------------------- : 當時我寫: : BCDE : CDE : -------------------------- : 後來面試的主管跟我說,第一個是*test++ : 所以應該是字串內容+1 所以答案是BBCDE : 第二個才是test++ : 因此答案是 BCDE : 當時我接受這種說法,但回家後,實際寫程式來run : 發現不對,答案印出來跟我寫的一樣 : 想問 : 1.是否編譯器把*test++解讀為test++ : 2.中間哪裡出了問題?哪個答案才是對的? 假設主管要表達的是 (*test)++ 的話 印象中standard好像有看到這個問題 C++ standard 2.14.5 String literals 有提到 Whether all string literals are distinct (that is, are stored in non overlapping objects) is implementation defined. The effect of attempting to modify a string literal is undefined. 另外根據不曉得從哪讀來的模糊印象,實務上compiler會把string literal存在程式中唯 讀的記憶體,所以真的去改會出現segmentation fault。 結論:主管的考題牽涉到C++中明確指出的undefined behavior,所以發生任何事都有可 能,而實務上會出現segmentation fault。 個人學淺,說錯還請諸位版大指正了,謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.136.119.208
BombCat:覺得只是單純operator優先權的問題 12/18 19:42
稍微修改一下內文,原文主管應該是想要 (*test)++ ※ 編輯: d8888 來自: 220.136.119.208 (12/18 20:01)
cobrasgo:"應該想要"和題目就是那樣是兩回事 12/19 07:20
d8888:誠如樓上所說 只是想表答即使不考慮運算子優先順序 12/19 10:47
d8888:這題目一樣有問題 12/19 10:49
d8888:結論是主管認知起碼弄錯兩點 運算以子順序 12/19 10:50
d8888:還有string literal修改為undefined behavior 12/19 10:51
BlazarArc:考operator優先順序實在很無聊,看考題就知道眼界 12/19 14:46