一個整常量後面加上u或U,就表示此常量為無符號數。如12345u或12345U,則電腦就會在記憶體裡按unsigned int規定的方式來存放。
如果是-12345u,那麼電腦會先將-12345轉換為其補碼形式53191,然後再按無符號數形式存放。
如果一個整常量後面加字母l或L,則表示為long int型常量。
當電腦遇到一個小數,則會先將它轉換成一個雙精確度資料存放區(64位),雖然提高了精度,但這樣運算速度就會降低。所以如果我們更注重運算速度,可以在小數後面加上f或F,來告訴電腦按單精確度處理,不要轉換為雙精確度數。
在不同類型資料的混合運算中,有一些隱形規則:
1 char和short是必須先轉換為int才可以進行運算的。
2 float一律轉換為雙精確度型再進行運算,即使是兩個float型資料相加,亦是如此。
3 如果int和double進行運算,那麼int先轉換成double,然後兩個double進行運算
4 如果int和unsigned int進行運算,那麼int要先轉換為unsigned int,然後兩個unsigned int進行運算
5 這些類型轉換是由系統自動完成的。
在強制類型轉換時,得到的是一個所需類型的中間變數,原來變數的類型不會發生變化,如(double)(x),x的類型本身不會變化。
單目運算子包括:!,~,++,–,-,(type),*,&,sizeof
單目運算子的優先順序僅次於(),[],->,.這四個(並非真正意義上的)運算子。
單目運算子的結合性是自右向左。如-i++,即-(i++);如*i++,即*(i++)。
C編譯系統會使用貪進法來識別運算子,如 i+++j,會被理解為(i++)+j
逗號運算式形如:運算式1,運算式2
逗號運算式的值是運算式2的值。
由於賦值運算子的優先順序高於逗號運算子,所以a=3*5,a*4被理解為(a=3*5),a*4
逗號運算子基本上是優先順序最最低的一個運算子,而賦值運算子基本上是排在倒數第二。(逗號全班倒數第一。賦值全班倒數第二,呵呵),你一定想知道倒數第三是誰,告訴你,條件運算子,也就是C中唯一的三目運算子"?:"。
C語言提供的關係運算子有6種:
<, <=, >, >=, ==, !=,其中前四種的優先順序要高於後兩種。
C語言提供3種邏輯運算子:
&&,||,!,這三種優先順序各不相同,!優先順序最高,&&次之,||優先順序最低。而且更複雜的是,&&和||的優先順序低於關係運算子,而!高於算術算符
總結起來就是:
逗號運算子<賦值運算子<||<&&<關係運算子<算術運算子<!
具有自右向左結合性的運算子都包括:賦值運算子,單目運算子和條件運算子。如a>b?a:c>d?c:d,即a>b?a:(c>d?c:d)
scanf函數會以空格來作為結束符。所以scanf("%s",str)的話,
如果輸入是how are you? 那麼最後str中存入的只有how。這點要特別注意。
共用體的定義為:
union 共用體名稱
{
成員列表;
}變數列表;
例如:
union data
{
int i;
char ch;
float f;
}a,b,c;
共用體變數所佔的記憶體長度是最長的成員的長度。
在引用共用體變數時應十分注意當前存放在共用體變數中的究竟是哪一個成員。
&a、&a.i、&a.ch、&a.f都是同一個地址值。
不能對共用體變數名賦值,也不能企圖引用變數名得到一個值,更不能在定義共用體時對它初始化。
位段的概念非常重要,在編寫網路程式常會用到。
struct packet_data
{
unsigned a:2;
unsigned b:6;
unsigned c:4;
unsigned d:4;
int i;
}data;
當然也可以不恰好佔滿一個位元組,如
struct packet_data
unsigned a:2;
unsigned b:3;
unsigned c:4;
int i;
}data;
這樣的話a,b,c會佔去2位元組中的前9位,而後7位會空閑下來,而i會從另一個新位元組開頭開始。
在引用位域時,要特別注意其最大值範圍,如佔2位,那麼最大值為3.
位段成員的類型只能指定為unsigned int或int型。
若要強制一個域從新位元組開始,那麼可以這樣:
unsigned a:1;
unsigned b:2;
unsigned :0;
unsigned c:3;
此時c會從一個新位元組開始儲存。
位段可以用%d來輸出。
可以定義無名位段,表示這些位我不用:
unsigned a:1;
unsigned :2; //這兩位空間不使用
unsigned c:3;