當前位置:學者齋 >

計算機 >C語言 >

c語言經典筆試題

c語言經典筆試題

引導語: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個字節才能存放下(包括末尾的?