當前位置:才華齋>計算機>C語言>

c語言經典筆試題

C語言 閱讀(2.7W)

引導語:C語言是一種計算機程式設計語言,它既具有高階語言的特點,又具有組合語言的特點。以下是小編整理的c語言經典筆試題,歡迎參考閱讀!

c語言經典筆試題

1.用預處理指令#define宣告一個常數,用以;#defineSECONDS_PER_YEAR(;2.寫一個“標準”巨集MIN,這個巨集輸入兩個引數並;#defineMIN(A,B)((A)<=;4.嵌入式系統中經常要用到無限迴圈,你怎麼樣用C;這個問題用幾個解決方案;while(1);一些程式設計師更喜歡如下方案:;for(;;);第三個方案是用goto;

1. 用預處理指令#define 宣告一個常數,用以表明1年中有多少秒(忽略閏年問題)

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

2. 寫一個“標準”巨集MIN,這個巨集輸入兩個引數並返回較小的一個。

#define MIN(A,B) ((A) <= (B) (A) : (B))

4. 嵌入式系統中經常要用到無限迴圈,你怎麼樣用C編寫死迴圈呢?

這個問題用幾個解決方案。我首選的方案是:

while(1)

{

}

一些程式設計師更喜歡如下方案:

for(;;)

{

}

第三個方案是用 goto

Loop:

...

goto Loop;

5. 用變數a給出下面的定義

a) 一個整型數(An integer)

b) 一個指向整型數的指標(A pointer to an integer)

c) 一個指向指標的的指標,它指向的指標是指向一個整型數(A pointer to a pointer to an integer) d) 一個有10個整型數的陣列(An array of 10 integers)

e) 一個有10個指標的陣列,該指標是指向一個整型數的(An array of 10 pointers to integers)

f) 一個指向有10個整型數陣列的指標(A pointer to an array of 10 integers)

g) 一個指向函式的指標,該函式有一個整型引數並返回一個整型數(A pointer to a function that takes an integer as an argument and returns an integer)

h) 一個有10個指標的陣列,該指標指向一個函式,該函式有一個整型引數並返回一個整型數( An array of ten pointers to functions that take an integer argument and return an integer )

答案是:

a) int a; // An integer

b) int *a; // A pointer to an integer

c) int **a; // A pointer to a pointer to an 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 function a that takes an integer argument and returns an integer

h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

6. 關鍵字static的作用是什麼?

這個簡單的問題很少有人能回答完全。在C語言中,關鍵字static有三個明顯的作用:

1). 在函式體,一個被宣告為靜態的變數在這一函式被呼叫過程中維持其值不變。

2). 在模組內(但在函式體外),一個被宣告為靜態的變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問。它是一個本地的全域性變數。

3). 在模組內,一個被宣告為靜態的函式只可被這一模組內的`其它函式呼叫。那就是,這個函式被限制在宣告它的模組的本地範圍內使用。

7.關鍵字const是什麼含意?

const int a;

int const a;

const int *a;

int * const a;

int const * a const;

前兩個的作用是一樣,a是一個常整型數。第三個意味著a是一個指向常整型數的指標(也就是,整型數是不可修改的,但指標可以)。第四個意思a是一個指向整型數的常指標(也就是說,指標指向的整型數是可以修改的,但指標是不可修改的)。最後一個意味著a是一個指向常整型數的常指標(也就是說,指標指向的整型數是不可修改的,同時指標也是不可修改的)。如果應試者能正確回答這些問題,那麼他就給我留下了一個好印象。

8. 關鍵字volatile有什麼含意 並給出三個不同的例子。

一個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。下面是volatile變數的幾個例子:

1). 並行裝置的硬體暫存器(如:狀態暫存器)

2). 一箇中斷服務子程式中會訪問到的非自動變數(Non-automatic variables)

3). 多執行緒應用中被幾個任務共享的變數

1). 一個引數既可以是const還可以是volatile嗎?解釋為什麼。

2). 一個指標可以是volatile 嗎?解釋為什麼。

3). 下面的函式有什麼錯誤:

int square(volatile int *ptr)

{

return *ptr * *ptr;

}

Ptr內容可能被修改,無法保證兩次取得同一個值,應該先取出值放入一個變數中,然後通過這個變數來計算

9. 嵌入式系統總是要使用者對變數或暫存器進行位操作。給定一個整型變數a,寫兩段程式碼,第一個設定a的bit 3,第二個清除a 的bit 3。在以上兩個操作中,要保持其它位不變。

#define BIT3 (0x1<<3)

static int a;

void set_bit3(void)

{

}

void clear_bit3(void)

{

a &= ~BIT3;

}

10. 嵌入式系統經常具有要求程式設計師去訪問某特定的記憶體位置的特點。在某工程中,要求設定一絕對地址為0x67a9的整型變數的值為0xaa66。編譯器是一個純粹的ANSI編譯器。寫程式碼去完成這一任務。 Int *p;

P=(int*)0x67a9;

*p=0xaa66;

11. 中斷是嵌入式系統中重要的組成部分,這導致了很多編譯開發商提供一種擴充套件—讓標準C支援中斷。具代表事實是,產生了一個新的關鍵字__interrupt。下面的程式碼就使用了__interrupt關鍵字去定義了一箇中斷服務子程式(ISR),請評論一下這段程式碼的。

__interrupt double compute_area (double radius)

{

double area = PI * radius * radius;

printf(" Area = %f", area);

return area;

}

12 . 下面的程式碼輸出是什麼,為什麼?

void foo(void)

{

unsigned int a = 6;

int b = -20;

(a+b > 6) puts("> 6") : puts("<= 6");

}

>6

13. 評價下面的程式碼片斷:

unsigned int zero = 0;

unsigned int compzero = 0xFFFF;

/*1's complement of zero */

14. 儘管不像非嵌入式計算機那麼常見,嵌入式系統還是有從堆(heap)中動態分配記憶體的過程的。那麼嵌入式系統中,動態分配記憶體可能發生的問題是什麼?

主要有三種類型:記憶體洩露、記憶體碎片和記憶體崩潰 記憶體崩潰是記憶體使用最嚴重的結果,主要原因有陣列訪問越界、寫已經釋放的記憶體、指標計算錯誤、訪問堆疊地址越界等等。碎片收集的問題,變數的持行時間等等

下面的程式碼片段的輸出是什麼,為什麼?

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

puts("Got a null pointer");

else

puts("Got a valid pointer");

該程式碼的輸出是“Got a valid pointer”。

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

#define dPS struct s *

typedef struct s * tPS;

答案是: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。

17.找錯題

試題1:

void test1()

{

char string[10];

char* str1 = "0123456789";

strcpy( string, str1 );

}

試題2:

void test2()

{

char string[10], str1[10];

int i;

for(i=0; i<10; i++)

{

str1[i] = 'a';

}

strcpy( string, str1 );

}

試題3:

void test3(char* str1)

{

char string[10];

if( strlen( str1 ) <= 10 )

{

strcpy( string, str1 );

}

}

解答:

試題1字串str1需要11個位元組才能存放下(包括末尾的?