C語言測試 想成為嵌入式程序員應知道的0x10個基本問題 原文出處 A 'C' Test: The 0x10 Best Questions for Would-be Embedded 以下是網路上找到中文版,作者不詳。 C語言測試是徵選嵌入式系統程式員過程中必須而且有效的方法。這些年我既參加也組織 從被面試者的角度來講,你能了解許多關於出題者或監考者的情況。這個測試只是出題者 如果上述任何問題的答案是“是”的話,那麼我知道我得認真考慮我是否應該去做這份工 從面試者的角度來講,一個測試也許能從多方面揭示應試者的素質。最基本的,你能了解 有了這些想法,我決定出一些真正針對嵌入式系統的考題,希望這些令人頭痛的考題能給 這個測試適用於不同水準的應試者,大多數初級水準的應試者的成績會很差,經驗豐富的 ============================================== 預處理器 (Preprocessor) 1.用預處理指令#define 聲明一個常數,用以表示1年中有多少秒 (忽略閏年問題) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在這想看到幾件事情︰ 2.寫一個“標準”巨集MIN ,這個巨集輸入兩個參數並返回較小的一個。 #define MIN(A, B) ((A) <= (B) ? (A) : (B))這個測試是為下面的目的而設的︰ least = MIN(*p++, b); 3.預處理器標識#error的目的是什麼? ==============================================
這個問題用幾個解決方案。我首選的方案是︰ 一些程式員更喜歡如下方案︰ 第三個方案是用 goto︰ ============================================== 數據宣告 (Data declarations) 5.用變數a給出下面的定義: 答案是︰ a) int a; // An integer 人們經常聲稱這裡有幾個問題是那種要翻一下書才能回答的問題,我同意這種說法。 ============================================== Static 這個簡單的問題很少有人能回答完全。在C語言中,關鍵字static有三個明顯的作用︰ ==============================================
7.關鍵字const有什麼含意? 我只要一聽到被面試者說︰“const意味著常數”,我就知道我正在和一個業餘者打交道 const int a; a.關鍵字const的作用是給讀你程式碼的人傳達非常有用的訊息,實際上,宣告一個參數 ============================================== Volatile(易變的) 一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去 a.並行設備的硬體暫存器 (如︰狀態暫存器) 假設被面試者正確地回答了這是問題
(嗯,懷疑是否會是這樣),我將稍微深究一下,看 下面是答案︰ 由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段程式碼可 ============================================== 位元操作 (Bit Manipulation) 9.嵌入式系統總是要用戶對變量或暫存器進行位操作。 給定一個整型變量a,寫兩段程式碼,第一個設置a的bit 3,第二個清除a 的bit 3。 在以上兩個操作中,要保持其它位不變。 對這個問題有三種基本的回應 最佳的解決方案如下︰ #define BIT3 (0x1 << 3) 一些人喜歡為設定和清除值而定義一個掩碼同時定義 ============================================== 存取固定的記憶體位置 (Accessing fixed memory locations) 在某工程中,要求設定一個絕對位址為0x67a9的整數型變數的值為0xaa55。 編譯器是一個純粹的ANSI編譯器。寫程式碼去完成這一任務。 這一問題測試你是否知道為了存取一絕對位址把一個整數型強製轉型 (typecast) 為一指 int *ptr; 一個較艱澀的方法是︰ ============================================== 中斷 (Interrupts) 11. 中斷是嵌入式系統中重要的組成部分,這導致了很多編譯開發商提供一種擴展-讓標 __interrupt double compute_area(double radius) ==============================================
void foo(void) 這個問題測試你是否懂得C語言中的整數自動轉型原則,我發現極少有開 13.評價下面的程式碼片斷︰ unsigned int zero = 0; 對于一個int型不是16位的處理器為說,上面的程式碼是不正確的。應編寫如下︰ unsigned int
compzero = ~0; ============================================== 動態記憶體分發 (Dynamic memory allocation) 14.儘管不像非嵌入式計算機那麼常見,嵌入式系統還是有從堆積(heap)中動態分發內存 char *ptr; 這是一個有趣的問題。最近在我的一個同事不經意把0值傳給了函數malloc,得到了一個 ============================================== Typedef 15.Typedef 在C語言中頻繁用以宣告一個已經存在的資料型態的同義字。也可以用預處理 #define dPS struct s *typedef struct s * tPS; dPS p1, p2; 第二個例子正確地定義了p3 和p4 兩個指標。 ============================================== 艱澀的語法 int a = 5, b = 7, c; 這個問題將做為這個測驗的一個愉快的結尾。不管你相不相信,上面的例子是完全合法的 c = a++ + b; ============================================== 好了,伙計們,你現下已經做完所有的測試了。這就是我出的C語言測試題,我懷著愉快 *denny6 推薦:推薦這篇文章 08/11/07 |