1. 寫一個“标椎”宏MIN,這個宏輸入兩個參數并傳回較小的一個。
#define MIN(A,B) ((A) < (B)?(A):(B)).
2. 嵌入式系統中經常要用到無限循環,你怎樣用C編寫死循環你呢?
While(1){};
3. 用變量a給出下面定義
- 一個整型數。
- 一個指向整型數的指針。
- 一個指向指針的的指針,它指向的指針是指向一個整型數。
- 一個有10個整型數的數組。
- 一個有10個指針的數組,該指針指向一個整型數的。
- 一個指向有10個整型數數組的指針。
- 一個指向函數的指針,該函數有一個整型參數并傳回一個整型數。
- 一個有10個指針的數組,該指針指向一個函數。
a)int a; //An integer
b)int *a; //A pointer to an integer
c)int **a; //A pointer to a pointer to integer
d)int a[10]; //An array of 10 integers
e)int *a[10]; //An array of 10 pointers to integers
f)int (*a)[10]; //A pointer to an array of 10 integers
g)int (*a) (int);//A pointer to a fuction a that takes an integeratgument and returns an ineteger
h)int (*a[10]) (int);//An array of 10 pointer to fuctions that takean integer argument and return an integer
4. 關鍵字static的作用是什麼?
關鍵字static有三個明顯的作用:
1)在函數體内,一個被聲明為靜态的變量在函數被調用過程中維持其值為上次使用後儲存的值。
2)在子產品内(但在函數體外),一個被聲明為靜态的變量可以被子產品内所有函數通路,但不能被子產品外其它的函數通路,它是一個本地的全局變量。
3)在子產品内,一個被聲明為靜态的函數隻可被這一子產品内的其它函數調用,那就是,這個函數被限制在聲明它的子產品的本地範圍内使用。
5.關鍵字const是什麼含義。
const int a;
int const a;
const int *a;
int* const a;
int const * a const;
前兩個作用一樣,a是一個常數整型數。第三個意味着a 是一個指向常數整型數的指針在(也就是,整型數是不可修改的,但指針可以)。第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的)。最後一個意味着a是一個指向常數整型數的常指針(也就是說,指針指向的整型數是不可修改,同時指針也是不可修改的)。
1)關鍵字const的作用是為給讀你代碼的人傳達非常有用的資訊,實際上,聲明一個參數為常量是為了告訴使用者這個參數的應用目的。如果你曾花很多時間清理其他人留下的垃圾,你就會很快學會感謝這點多餘的資訊。(當然,懂得用const的程式員很少會留下的垃圾讓别人來清理的。)
2)通過各優化器一個附加的資訊,使用關鍵字const也許能産生更緊湊的代碼。
3)合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現。
6.嵌入式系統總是要使用者對變量或寄存器進行位操作。給定一個整型變量a,寫兩端代碼,第一個設定a的bit3,第二個清除a的bit3。在以上兩個操作中,要保持其它位不變
#define BIT3 (0x1 << 3)
static int a;
void set_bit3(void)
{
a |= BIt3;
}
void clear_bit3(void)
{
a &= ~BIt3;
}
7.嵌入式系統經常具有要求程式員去通路某特定的記憶體位置的特點。在某工程中,要求設定一絕對位址為0x67a9的整型變量的值為0xaa66。編譯器是一個純粹的ANSI編譯器。寫代碼去完成這一任務。
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa55;
一個較晦澀的方法是:
8.下面的代碼輸出是什麼,為什麼?
void fool(void)
{
unsigned int a = 6;
int b = -20;
(a + b >6)?put("> 6"):puts(" <= 6");
}
這個問題測試你是否懂得C語言中的整數自動轉換原則,而有些開發者懂得極少這些東西。不管如何,這無符号整型問題的答案是輸出是“>6”。原因是表達式中存在有符号類型和無符号類型時所有的操作數都自動轉換為無符号類型。是以 -20變成了一個非常大的正整數,是以該表達式計算出的結果大于6。這一點對于應當頻繁用到無符号資料類型的嵌入式系統來說是非常重要的。
9:#與##的作用?
答:#是把宏參數轉化為字元串的運算符,##是把兩個宏參數連接配接的運算符。
例如:
#define STR(arg) #arg 則宏STR(hello)展開時為”hello”
#define NAME(y) name_y 則宏NAME(1)展開時仍為name_y
#define NAME(y) name_##y 則宏NAME(1)展開為name_1
#define DECLARE(name, type) typename##_##type##_type,
則宏DECLARE(val, int)展開為int val_int_type
10.請寫一個C函數,若處理器是Big_endian的,則傳回0;若是Little_endian的,則傳回1.函數原型:int checkCPU()
int checkCPU()
{
short a = 0x1234;
char *p = &a;
if(p[0] == 0x12)
return 0; //big endian
else
return 1;
}
11.合法的浮點數有兩種表示形式:
十進制小數形式。他有數字和小數點組成,必須有小數點。例如(123.)(123.0)(.123)。
指數形式。如123e3。字母e(或E)之前必須有數字,e後面的指數必須為整數。
規範化的指數形式裡面,小數點前面有且隻有一位非零的數字。如1.2345e8