--- tags: 小雞上工 --- # 題目 - ![](https://i.imgur.com/ty9JHry.jpg) - 第五題 - 第一行用#define STR(s) #s - 代表若呼叫STR(s),會轉成s(字串形式) - printf(STR(Q))會輸出"Q",會有那兩個雙引號(強調) - 第二行則是將Q定義為常數10 - 第三行則是定義PRINT的行為 - 第五行可以由左至右展開 - 1.PRINT函式會吃s這個參數 - 2.PRINT的參數為STR(STR(Q)) - 3.因為由左至右展開,所以優先執行外層的STR(),將內層的STR(Q)變為字串型態,所以不會繼續執行下去,然後交由PRINT印出。輸出為 - ![](https://i.imgur.com/2uHnaMl.png) - 第六題 - 變數i - static storage duration - scope - 全域 - linkage - internal linkage(只限於此程式使用,若為external linkage則其他檔案也可以參考其值) - 變數j - static storage duration - scope - 只限於f函式內 - linkage - internal linkage - 第七題 ```c= int ***p = a[5]; ``` - 第八題 ```c= int **p = a[5][0]; ``` - ![](https://i.imgur.com/JEhIwJB.jpg) - 第一題 - 第一行我後面詳細講 - 第二行與第三行只是將參數轉為字串型態 - 第四行的join則是在a b之間加入bash_bash - 根據我的觀察,在一個井字號與一個井字號之間,不管出現多少次##,都會只算一次,此題輸出結果為 - ![](https://i.imgur.com/5teHf3s.png) - 中間的空格為一格,不論bash_bash內的雙井字號空格有多少,輸出都為一格 - 而若bash_bash宣告為 # ## ## # # ## ## #則,輸出為 - ![](https://i.imgur.com/IRUfGBb.png) - 由此可以發現,在macro內,一個井字號與另一個井字號為一對,中間有任何重複的雙井字號都只會算一次(這情況只限於雙井字號,若改為其他字元則整串會印出) - 第二題 - 第一行,若出現a##b此情況,則代表將b接在a後面,形成ab - 而第四行一樣,拆解巨集由左至右,呼叫concat2,最終輸出為az zbz zc - 第三題 - 在debug內的...代表參數的數量是不固定的 - __VA_ARGS__代表在fprint內的參數也是不固定的,可以使用##__VA_ARGS__來取消此設定(注意:只能用在巨集當中) - 由於題目在debug內只有一串字串,而且被fst給用了,故__VA_ARGS__無法作用,會產生錯誤訊息 - ![](https://i.imgur.com/8WnRXU3.png) - 第四題 - 同上,但因為關掉了__VA_ARGS__所以會印出結果 - division by zero - 第五題 ```c= int **p = a[5]; ``` - ![](https://i.imgur.com/aTcGMwZ.jpg) - 第六題 ```c= int *p = a[5][0]; ``` - 第七題 ```c= typedef int* foo[10]; typedef int sum(int,int); ``` - 第九題 - 可以將i[a]看成a[i],就很好理解了 - 第十題 - 可以將&b[0]視為b,就很好理解了 - ![](https://i.imgur.com/6M4NWIx.jpg) - 第一題 - 若要宣告成函式應改為 ```c= int g(int,int,int,int); ``` - 第五題 - 有解過了 - 第六題 - 其實就等於b[1][2],所以答案為-6 - 第七題 - 上述推倒可得 x ## y - 第八題 - 一模一樣 - 第九題 - ㄜ0.0 - 第十題 - :) - ![](https://i.imgur.com/K1BiXW8.jpg) - 第一題 - 輸出為![](https://i.imgur.com/TLe17NS.png) - 我也有點不懂.. - 2 3題有解過 - 第四題 - 解過!