一道C面試題的思考

2021-09-26 06:28:56 字數 1443 閱讀 7320

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 分鐘內,我給出了第一種思路 排序。將數字按公升序排序,去除最小的那個數即可。存在問題 時間複雜度高,只考慮了正數的情況。面試官給出了第一次提示時間複雜度過高,要求降低時間複雜度。於是在經過幾分鐘思考後,...