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))); }