想成為嵌入式程式設計師應知道的0x10個基本問題 轉

2021-07-09 12:05:18 字數 2710 閱讀 6430

更多1

**例子(code examples)

12 . 下面的**輸出是什麼,為什麼?

void foo(void)

這個問題測試你是否懂得c語言中的整數自動轉換原則,我發現有些開發者懂得極少這些東西。不管如何,這無符號整型問題的答案是輸出是 ">6"。原因是當表示式中存在有符號型別和無符號型別時所有的運算元都自動轉換為無符號型別。因此-20變成了乙個非常大的正整數,所以該表示式計算出的結果大於6。這一點對於應當頻繁用到無符號資料型別的嵌入式系統來說是丰常重要的。如果你答錯了這個問題,你也就到了得不到這份工作的邊緣。

13. 評價下面的**片斷:

unsigned int zero = 0;

unsigned int compzero = 0xffff; 

/*1's complement of zero */

對於乙個int型不是16位的處理器為說,上面的**是不正確的。應編寫如下:

unsigned int compzero = ~0;

這一問題真正能揭露出應試者是否懂得處理器字長的重要性。在我的經驗裡,好的嵌入式程式設計師非常準確地明白硬體的細節和它的侷限,然而pc機程式往往把硬體作為乙個無法避免的煩惱。

到了這個階段,應試者或者完全垂頭喪氣了或者信心滿滿志在必得。如果顯然應試者不是很好,那麼這個測試就在這裡結束了。但如果顯然應試者做得不錯,那麼我就扔出下面的追加問題,這些問題是比較難的,我想僅僅非常優秀的應試者能做得不錯。提出這些問題,我希望更多看到應試者應付問題的方法,而不是答案。不管如何,你就當是這個娛樂吧...

動態記憶體分配(dynamic memory allocation) 

14. 

儘管不像非嵌入式計算機那麼常見,嵌入式系統還是有從堆(heap)中動態分配記憶體的過程的。那麼嵌入式系統中,動態分配記憶體可能發生的問題是什麼?這裡,我期望應試者能提到記憶體碎片,碎片收集的問題,變數的持行時間等等。這個主題已經在esp雜誌中被廣泛地討論過了(主要是 p.j. plauger, 他的解釋遠遠超過我這裡能提到的任何解釋),所有回過頭看一下這些雜誌吧!讓應試者進入一種虛假的安全感覺後,我拿出這麼乙個小節目:下面的**片段的輸出是什麼,為什麼?

char *ptr;

if ((ptr = (char *)malloc(0)) == null) 

puts("got a null pointer");

else

puts("got a valid pointer");

這是乙個有趣的問題。最近在我的乙個同事不經意把0值傳給了函式malloc,得到了乙個合法的指標之後,我才想到這個問題。這就是上面的**,該**的輸出是"got   a valid pointer"。我用這個來開始討論這樣的一問題,看看被面試者是否想到庫例程這樣做是正確。得到正確的答案固然重要,但解決問題的方法和你做決定的基本原理更重要些。

typedef 

15 typedef 

在c語言中頻繁用以宣告乙個已經存在的資料型別的同義字。也可以用預處理器做類似的事。例如,思考一下下面的例子:

#define dps struct s *

typedef struct s * tps;

以上兩種情況的意圖都是要定義dps 和 tps 作為乙個指向結構s指標。哪種方法更好呢?(如果有的話)為什麼?

這是乙個非常微妙的問題,任何人答對這個問題(正當的原因)是應當被恭喜的。答案是:typedef更好。思考下面的例子:

dps p1,p2;

tps p3,p4;

第乙個擴充套件為

struct s * p1, p2;

上面的**定義p1為乙個指向結構的指,p2為乙個實際的結構,這也許不是你想要的。第二個例子正確地定義了p3   和p4 兩個指標。

晦澀的語法

16 . c語言同意一些令人震驚的結構,下面的結構是合法的嗎,如果是它做些什麼?

int a = 5, b = 7, c;

c = a+++b;

這個問題將做為這個測驗的乙個愉快的結尾。不管你相不相信,上面的例子是完全合乎語法的。問題是編譯器如何處理它?水平不高的編譯作者實際上會爭論這個問題,根據最處理原則,編譯器應當能處理盡可能所有合法的用法。因此,上面的**被處理成:c = a++ + b;

因此, 這段**持行後a = 6, b = 7, c = 12。

如果你知道答案,或猜出正確答案,做得好。如果你不知道答案,我也不把這個當作問題。我發現這個問題的最大好處是這是乙個關於**編寫風格,**的可讀性,**的可修改性的好的話題。

好了,夥計們,你現在已經做完所有的測試了。這就是我出的c語言測試題,我懷著愉快的心情寫完它,希望你以同樣的心情讀完它。如果是認為這是乙個好的測試,那麼盡量都用到你的找工作的過程中去吧。天知道也許過個一兩年,我就不做現在的工作,也需要找乙個。

作者介紹:

nigel jones       是乙個顧問,現在住在maryland,當他不在水下時,你能在多個範圍的嵌入專案中找到他。他很高興能收到讀者的來信,他的email位址是: [email protected]

參考文獻

1) jones, nigel, "in praise of the #error directive," 

embedded systems programming, september 1999, p. 114.

2) jones, nigel, " efficient c code for eight-bit mcus 

," embedded systems programming, november 1998, p. 66. 

想成為嵌入式程式設計師應知道的0x10個基本問題

6 這個問題測試你是否懂得c語言中的整數自動轉換原則,我發現有些開發者懂得極少這些東西。不管如何,這無符號整型問題的答案是輸出是 6 原因是當表示式中存在有符號型別和無符號型別時所有的運算元都自動轉換為無符號型別。因此 20變成了乙個非常大的正整數,所以該表示式計算出的結果大於6。這一點對於應當頻繁...

想成為嵌入式程式設計師應知道的0x10個基本問題

c語言測試是招聘嵌入式系統程式設計師過程中必須而且有效的方法。這些年,我既參加也組織了許多這種測試,在這過程中我意識到這些測試能為面試者和被面試者提供許多有用資訊,此外,撇開面試的壓力不談,這種測試也是相當有趣的。從被面試者的角度來講,你能了解許多關於出題者或監考者的情況。這個測試只是出題者為顯示其...

成為嵌入式程式設計師應知道的0x10個問題

c語言測試是招聘嵌入式系統程式設計師過程中必須而且有效的方法。這些年,我既參加也組織了許多這種測試,在這過程中我意識到這些測試能為面試者和被面試者提供許多有用資訊,此外,撇開面試的壓力不談,這種測試也是相當有趣的。從被面試者的角度來講,你能了解許多關於出題者或監考者的情況。這個測試只是出題者為顯示其...