C語言經典筆試題目


1.bool,float,指針變量 與 “零值” 比較的if語句

注意點:c語言中bool類型采用整數存儲,0為false,非0均為true; float類型采用IEEE754標准,第一位符號位,中間8位階數,最后23位為尾數(1.尾數),有精度問題。

bool flag 與零值比較:

  標准答案:if(flag)  if(!flag) ;

  不良風格:if(flag == TRUE)  if(flag ==1 )  if(flag == FALSE)  if(flag == 0)

float f 與零值比較:

  標准答案:

  if( f < -0.000001 && f > 0.000001) //  !=0 

  if( f > -0.000001 && f < 0.000001)//    =0

  錯誤寫法:

  if( f = 0 )

  if( f = 0.0)

指針變量與零值比較:if(p == NULL)  if(p != NULL)

2.數組int c[3][3]; 為什么c ,*c的值相等, (c+1), (*c+1)的值不等,c,*c,**c代表什么意思?

c是第一個元素的地址,*c是第一行元素的首地址,其實第一行元素的地址就是第一個元素的地址,**c是第一行一個元素。為什么c,*c的值相等?c:數組名;是一個二維指針,他的值就是數組的首地址,即第一行元素的首地址(等於*c),也等於第一行第一個元素的地址(&c[0][0]);可以說成是二維數組的行指針。

*c: 第一行元素的首地址;是一個一維指針,可以說成是二維數組的列指針。

**c:二維數組中的第一個元素的值;即:c[0][0]

所以:c和*c的值是相等的,但他們兩者不能相互賦值(類型不同)

3.float a,b,c,問:等式(a+b)+c==(b+a)+c  和 (a+b)+c==(a+c)+b能否成立?

兩者都不行。在比較float和double時,不能簡單的比較。由於計算誤差,相等的概率很低。應判斷兩數之間是否落在區間(-e,e)內。這個e應比浮點數的精度大一個數量級。

4.處理器標識#error的目的是什么?

主要考點:預處理指令。(預處理→編譯→匯編→鏈接)

預處理指令在預處理階段全部被替換,不帶分號

參考答案:編譯時輸出一條錯誤信息,並中止繼續編譯。一般情況下和#if 一起使用

5.語句for( ; 1 ; )有什么問題?它是什么意思?

無限循環,等價於for(; ;) , while(1)

6.strcpy()和memcpy()的區別

字符串和內存的操作函數,都在string.h中,strcpy()在遇到'\0'就停止copy(包含'\0'),而memcpy()必須指定copy多少字節。

7.do...while 和 while...有什么區別?

前者至少執行一次,后者可能一次都不執行(直到型循環和當型循環)

8.怎樣用C編寫死循環

for(;;) while(1)

9.用變量a給出下面的定義

①一個有10個指針的數組,該指針是指向一個整型數的  // int* a[10]

②一個指向有10個整形數組的指針 // int (*a)[10]

③一個指向函數的指針,該函數有一個整形參數並返回整型值 // int (*a)(int)

④一個有10個指針的數組,該指針指向一個函數,該函數有一個整形參數並返回一個整形值 // int (*a[10])(int)

10.請問以下代碼有什么問題:

1 char* s = "AAA";
2 printf("%s",s);
3 s[0]='B';
4 printf("%s",s);

考點:字符串常量問題。C語言中雙引號部門內容稱為字符串常量,其值不允許被更改。本題中,s指向了AAA,用s[0]試圖更改常量值會出錯。

若用char s[] = "AAA",再利用s[0]='B'更改則不會報錯

11.C和C++中struct有什么不同

c中的struct不可以含有成員函數,而c++中的struct可以;C++中struct和class的主要區別在於默認的存取權限不同,struct默認為public,而class默認為private

12.const 與 #define的比較 ,const有什么優點?

const常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查,而對后者只進行字符替換,沒有類型安全檢查,並且在字符替換時可能產生意料不到的錯誤(邊際效應)。

有些集成化的調試工具可以對const常量進行調試,但是不能對宏常量進行調試、

13.引用和指針的區別。

①引用被創建的同時必須被初始化,指針則可在任何時候被初始化

②不能有NULL引用,引用必須與合法的存儲單元關聯(指針則可以是NULL)

③一旦引用被初始化,就不能改變引用關系,指針則可以隨時改變所指對象。

14.以下代碼有什么問題?

void getmemory(char* p){
  p = (char*)malloc(100);
  strcpy(p,"hello world");        
}
int main(){
    char* str = NULL;
    getmemory(str);
    printf("%s\n",str);
    free(str);
    return 0;
}

程序崩潰!getmemory中的malloc不能返回動態內存,free()對str操作很危險

15.以下代碼產生什么結果?為什么?

char szstr[10];
strcpy(szstr,"123456789");

長度不一樣 出現段錯誤,操作了不屬於自己的空間

引申考點:"0123456789ABCDEF"[i] 這種寫法也可以,得到指向第一個元素的地址值 

16.數組和鏈表的區別

數組:數據順序存儲,固定大小;鏈表:數據可以隨機存儲,大小可動態改變

17.以下代碼會出現什么問題?打印結果是多少?

void main(){
    char aa[10];
    printf("%d",strlen(aa));
}//輸出結果在不同編譯器下結果會不一樣

sizeof()返回值和是否初始化無關,但strlen()返回值與是否初始化有關,打印結果未知。

18.給定結構struct A,問sizeof(A)=?

struct A{
    char t:4;
    char k:4;
    unsigned short i:8;
    unsigned long m;
};

答案 : 8 (考慮字節對齊)

19.給定結構struct name1,問sizeof(name1)=?

struct name1{
    char str;
    short x;
    int num;
};

答案:8

20.int a,b,c 請寫函數實現c = a+b,不可以改變數據類型,如將c改為long int,判斷是否溢出?

bool add(int a,int b,int* c){
    *c = a+b;
    return (a>0 && b>0 && (*c < a || *c < b) || (a<0 && b<0 && (*c > a) || *c >b)));
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM