標籤:
2.1理解函式宣告
不論什麼C變數的聲明都由兩部分組成:類型以及一組類似運算式的聲明符號。比如
float f;
這個聲明的含義是:當對其求值時,運算式f和g的類型為浮點數類。由於聲
明符與運算式的相似。所以我們也能夠在聲明符中隨意使用括弧:
float ((f))
這個聲明的含義是:當對其求值時,W)的類型為浮點類型,由此能夠推知,f也是浮點類型。類似的。
float *g(),(*h)();
表示*g()與(*h)()是浮點運算式。
由於()結合優先順序高於*。*g()也就是*(g()):g是一個函數。該函數的返回值類型為指向浮點數的指標。同理,能夠得出h是一個函數指標,h所指向函數的返回值為浮點類型。
理解了上面的知識後。我們就能夠分析signal函數了,signal函數的原型為:
#include <signal.h>
void ( *signal ( int signo ,void (*func)(int) ) ) ( int );
signal函數原型說明該函數須要兩個參數,返回一個函數指標,而該指標所指向的函數須要一個整型參數,無返回值。
第一個參數signo是一個整數,第二個參數是函數指標。它所指向的函數須要一個整型參數,無返回值。用自然語言描寫敘述也就是要向訊號處理常式傳遞一個整型參數,而它卻無返回值。當調用signal設定訊號處理常式時,第二個參數是指向該函數(也就是訊號處理常式)的指標。
signal的返回值則是指向之前的訊號處理常式的指標。
2.2運算子的優先順序問題
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFuY2h1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >
優先順序最高者事實上並非真正意義上的運算子,包含:數組下標、函數叫用作業符各結構成員選擇操作符。它們都是白左於右結合。因此a.b.c的含義是(a.b).c,而不是a.(b.c)。
單目運算子的優先順序僅次於前述運算子。在全部的真正意義上的運算子中。它們的優先順序最高。
由於函數調用的優先順序要高於單目運算子的優先順序,所以假設p是一個函數指標。要調用p所指向的函數,必須這樣寫:(*p)()。假設寫成*p()。編譯器會解釋成*(p())。類型轉換也是單目運算子。它的優先順序和其它單目運算子的優先順序一樣。單目運算子是白右至左
結合,因此*p++會被編譯器解釋成*(p++),即取指標p所指向的對象。然後將p遞增1:而不是(*p)++,即取指標p所指向的對象,然後將該對象遞增1。
優先順序比單目運算子要低的,接下來就是雙目運算子。
在雙目運算子中,算術運算子的優先順序最高。移位元運算符次之,關係運算子再次之,接著是邏輯運算子。賦值運算子,最後是條件運算子(為三目運算子)。
我們須要記住的最重要的兩點是:
1.不論什麼一個邏輯運算子的優先順序低於不論什麼一個關係運算子。
2.移位元運算符的優先順序比算術運算子要低,可是比關係運算子要高。
在全部的運算子中,逗號運算子的優先順序最低。這一點非常easy記住,由於逗號運算子經常使用於在須要一個運算式而不是一條語句的情形下替換作為語句結束標誌的分號。
2.3注意作為語句結束標誌的分號
在C程式中假設不小心多寫了一個分號可能不會造成什麼不良後果:這個分號或許會被視作一個不會產生不論什麼實際效果的空語句;或者編譯器會由於這個多餘的分號而產生一條警告資訊,依據警告資訊的提示可以非常easy去掉這個分號。一個重要的例外情形是在if或者while語句之後須要緊跟一條語句時。假設此時多了一個分號,那麼原來緊跟在if或者while了句之後的語句就是一條單獨的語句。與條件推斷部分沒有了不論什麼關係。考慮以下的
這個例了:
if(x [i]>big);
big=x[i];
2.4 switch語句
switch語句中要注意case後面加break。這樣才幹起到控制的作用。當然有些時候,有益不加break以達到某種效果。
2.5懸掛else引發的問題
C語言中if else配對規則:else始終同一對括弧內近期的為匹配的if結合。
比如這樣就可能和違背編程者的本意:
if(x==0)
if(y==0) error();
else{
z = x + y;
}
縮排後。成這樣
if(x == 0)
if(y == 0)
error();
else{
z= x + y;
}
為了避免這樣的情況,在if和else後面都要加花括弧
C陷阱與缺陷之文法陷阱