作者d8888 (Don)
看板C_and_CPP
標題Re: [問題] point++
時間Wed Dec 18 19:15:14 2013
※ 引述《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