c陷阱與缺陷——陷阱

1.詞法陷阱

例1:if(x=y) break;  這就話的意思就是把y賦值x,判斷x是否爲0,實則是在判斷y是否爲0;
例2:while(c=' '|| c=='\t' || c=='\n')這句話的意思就是' '|| c=='\t' || c=='\n‘賦值給c,而有’ ‘符本身就是不爲0的數,所以這就是while(1)的意思。
例3: int x=4,*p=new int ;  *p=2; cout<<a/*p;這會編譯器識別成/*註釋符,正確的寫法: int x=4,*p=new int ;  *p=2; cout<<a/(*p);
這個涉及到編譯器的編譯過程,編譯原理的問題:編譯器是利用貪心算法來編譯的,所以會識別成/*
例4:注意010和10 的區別010是八進制寫法,一般也不會這樣寫。
例5: ’‘和“”的差別,’‘是單個字符,“”是字符串的表示。

2.語法陷阱

1.函數申明:
例子:(*(void(*)())0)();//這個函數申明
這個例子涉及函數指針和指針函數 ,看一下例子:float *a(),(*b)();這是兩個定義呢,a是一個函數,返回值是一個float型指針,b是一個指針,返回值是float。這是因爲()的優先級高於*的原因。
如何去調用一個指針函數呢,就是申明(*b)();也可以簡化成b();
所以最初大那個例子可以解釋了:
(void(*)())0=p是一個將常數0強制轉化成返回值爲void類型的函數指針p,那麼就是(*p)()的意思,調用函數指針的意思。
2.運算符優先級:單目大於多目運算符,自左而右要高於自右向左。
這個需要記住的最重要的兩點:1任何一個邏輯運算符的優先級低於任何一個關係運算符 2.移位運算符的優先級比算術運算符的要低,但比關係運算符要高。
3.結束標識符:
if(n<3)  return //;(少了一個分號結束符)
i=3;
實際上就會變成if(n<3) return  i=3;這樣一句話。
4.函數調用:f()與f,f()是一個函數調用,f是一個函數地址

3.語義陷阱

1.看一段代碼:
char *r,*malloc();
	r=malloc(strlen(s)+strlen(t));
	strcpy(r,s);
	strcat(r,t);
這個是爲r申請一段內存,但是忽略了申請不成功的情況。所以要修改考慮申請不成功的地方。
2.整數溢出:
如何判斷兩個數之和是否爲整數溢出呢??結果是這樣的,將int裝換爲unsigned int ,然後將這兩個數相加判斷是否超出了最後的整數。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章