c語言真的是學無止境的感覺,大部分同學大學都會開設c語言課程。很多人把c語言二級過了就感覺入門了;對於那些在做嵌入式開發的工程師,幾乎每天都要接觸c語言,很多人會感覺自己c語言學得很溜了。那好,咱們用一道c語言面試題來測試一下。
首先給出題目:
定義乙個巨集,求兩個數中的最大數
ok,很多人應該能很快寫出
#define max(x,y) x > y ? x : y
接下來我們寫乙個測試程式
#define max(x,y) x > y ? x : y
int main(void)
我們會發現第四個測試不是我們的要結果了。這是因為巨集展開後,就變成了這個樣子:
printf("max=%d",3!=3>1!=2?3!=3:1!=2);
這個時候大於號(>)的優先順序更高,所以就出現了問題了。
可能很多人已經想到了解決方法了,比較有經驗的工程師基本也比較少犯上面的錯誤。
加上括號就可以解決上面的問題了。
#define max(x,y) (x) > (y) ? (x) : (y)
ok,接下來我們再寫乙個測試程式
#define max(x,y) (x) > (y) ? (x) : (y)
int main(void)
執行結果:
並不是我們所期望的11。我們將其展開後為:
7 + (3) > (4) ? (3) : (4);
這個時候加號(+)的優先順序又比大於號(>)高,所以就出現了這種結果。
#define max(x,y) ((x) > (y) ? (x) : (y))
到這裡算是比較完整的了,在面試中要是能寫出這個,那算基本功還是比較紮實的了。
那我們再寫乙個測試程式
#define max(x,y) ((x) > (y) ? (x) : (y))
int main(void)
執行結果:
這裡面的j會做兩次自增運算, 所以列印出來的結果是做了一次自增後的結果。
#define max(type,x,y)()
int main(void)
到這裡基本算比較完美了!是不是很折騰, 程式的bug就是這樣一步一步修復的過程。
如果你能一下就寫出最後的**,那說明你確實是666了,通過上面的一步一步分析是為了告訴大家,c語言真的有很多東西可以讓我們去琢磨!我們也還有很長的路要走。
一道面試題的思考
在繼承中new和override相同點和區別?看下面的 有乙個基類a,b1和b2都繼承自a,並且使用不同的方式改變了父類方法print 的行為。測試 輸出什麼?為什麼?public void dotest public class a public class b1 a public class b...
一道面試題引發的思考
首先我們給出這道面試題的 以及題目 lista new arraylist list.add 1 list.add 2 for string item list 問 上段 執行會報錯嗎?如果把 1 換成 2 會報錯嗎?為什麼?首先給出答案 上面這段 執行不會報錯。把 1 換成 2 再執行就會報錯。為...
一道面試題引發的思考
好的面試官能夠能好的和面試者互動,而一場好的面試也能帶給面試者更多的思考 面試官給我出題後的 1 分鐘內,我給出了第一種思路 排序。將數字按公升序排序,去除最小的那個數即可。存在問題 時間複雜度高,只考慮了正數的情況。面試官給出了第一次提示時間複雜度過高,要求降低時間複雜度。於是在經過幾分鐘思考後,...