Re: [問題] 面試遇到的問題

看板C_and_CPP作者 (坐吃山空)時間9年前 (2015/08/01 00:14), 9年前編輯推噓6(605)
留言11則, 8人參與, 最新討論串3/4 (看更多)
又到了練習上色的時候啦~ ※ 引述《caxz ( )》之銘言: : 前幾天去M面試預到的幾個城是問題,請各位高手解解惑 : void f(int a) : { : if(a-- >0) : { : f(a); // (1) : cout<< a; // (2) : f(a); // (3) : } : } : int main() : { : int a=3; : f(a); : } 依照函式呼叫順序: 一開始: f(3) // main 裡面呼叫的 展開 f(3): f(3): f(2) cout << 2 f(2) 展開 f(2): f(3): f(2): f(1) cout << 1 f(1) cout << 2 f(2): f(1) cout << 1 f(1) 展開 f(1) f(3): f(2): f(1): f(0) cout << 0 f(0) cout << 1 f(1): f(0) cout << 0 f(0) cout << 2 f(2): f(1): f(0) cout << 0 f(0) cout << 1 f(1): f(0) cout << 0 f(0) 因為 f(0) 展開後甚麼都不會做 因此我們收集一下 cout 的順序 cout << 0 cout << 1 cout << 0 cout << 2 cout << 0 cout << 1 cout << 0 你說面試要畫這個嗎? 如果你看得出來這個顆跑中序的樹就不用 QQ : 我事後用devC++跑了一下結果是 0102010 : 但我無法看懂f()內的邏輯... : 例如 : 是執行完第一行之後(也就是執行 f(2)->f(1)->f(0)->end ) : 之後才會執行第二行? : ==================================================== : 下列成是可能有什麼錯誤? : 我事後自己在devC++上跑都能動, 實在不解多宣告 volatile 有什麼影響? : int SQR(volatile int *a) : { : return (*a)*(*a); : } : int main() : { : int a = 5; : int *p = &a; : SQR(p); : } : ===================================================== 這也是老梗啦. 這邊給你 volatile 是要提示你這個題目裡面 a 指向的值可能在你未被告知的時間點變動 所以前後兩次 *a 可能會得到不同的值。 那要看對方想問甚麼,如果是想問怎麼改會對的話,你可以敲他的頭。 : 第三題 更改後 : int main() : { : : float a = 0.7; : : if(a > 0.7) cout<< "C" <<endl; : else cout<< "C++" <<endl; : //以上這段印出C++ : : if(a < 0.7) : cout<< "C" <<endl; : else : cout<< "C++" <<endl; : //以上這段印出C : } 改成這樣應該是考字面常數 (literal) 首先要知道 0.7 的型別是 double 所以 float a = 0.7; 會做一個隱性轉型. 0.7 不論用 double 或 float 表示,在常見的編譯條件下, 都會變成 0.6999 多, 但是 double 後面的 "多" 因為精度關係硬是比較多了一點。 而比較的時候 a > 0.7 或 a < 0.7 就是轉成 float 的 0.7 跟 double 的 0.7 比誰多而已。 我還看不出來跟 C 或 C++ 的差別有甚麼關係 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.122.83.198 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1438359264.A.A58.html ※ 編輯: Feis (140.122.83.198), 08/01/2015 00:23:59

08/01 00:26, , 1F
感謝!!!!!!!! 不過第三題其實我打錯了 剛才已修正
08/01 00:26, 1F
※ 編輯: Feis (140.122.83.198), 08/01/2015 00:40:13

08/01 01:15, , 2F
請問為啥volatile那提 a有機會改數值呢?
08/01 01:15, 2F

08/01 01:19, , 3F
這就是 volatile 神秘的地方
08/01 01:19, 3F

08/01 01:20, , 4F
我個人的想法是這題目出得不好
08/01 01:20, 4F

08/01 01:23, , 5F
含數參數本來就是變量,幹嘛加volatile??
08/01 01:23, 5F

08/01 08:19, , 6F
08/01 08:19, 6F

08/01 09:44, , 7F
沒有volatile,compiler可能會最佳化成只對a取一次值
08/01 09:44, 7F

08/01 18:05, , 8F
請問這裡main function沒做事 以這case 不加volatile
08/01 18:05, 8F

08/01 18:05, , 9F
跟加了應該沒差吧?
08/01 18:05, 9F

08/01 22:14, , 10F
volatile表示其他thread或硬體可能會在背後亂搞
08/01 22:14, 10F

08/01 22:16, , 11F
提示complier不要以為看不到別人動他他就不會動
08/01 22:16, 11F
文章代碼(AID): #1LkvxWfO (C_and_CPP)
文章代碼(AID): #1LkvxWfO (C_and_CPP)