1. 程式人生 > >Linuxc基礎 二十二

Linuxc基礎 二十二

關鍵字(static)

作用:修飾變數(區域性變數和全域性變數)
靜態全域性變數,作用域僅限於變數被定義的檔案中,其他檔案即使使用extern宣告也沒法使用他。
靜態區域性變數,在函式體裡面定義的,就只能在這個函式裡用了,同一個文件中的其他函式也用不了
作用:修飾函式
用內部函式的好處:不同的人編寫不同的函式時,不用擔心自己定義的函式是否會與其他檔案中的函式同名。

基本資料型別

在32位系統:short 2位元組、int 4位元組、long 4位元組、float 4位元組、double 8位元組、char 1位元組。
變數的命名規則:
1、命名應當直觀且可以拼讀,可望文知意,便於記憶和閱讀。
2、命名的長度應當符合“min-length&&max-information”原則。
3、當識別符號由多個片語成時,每個詞的第1個字母大寫,其餘全小寫。
4、儘量避免名字中出現數字編號,如Value1、Value2等,除非邏輯上的確需要編號,比如驅動開發時引腳命名,費邊好名字反而不好。
5、隊在多個檔案之間共同使用的全域性變數或函式要加範圍限定符
識別符號的命名規則:
1、識別符號名分為兩部分:規範識別符號字首(字尾)+含義標識。(非全域性變數可以不使用範圍限定符字首)
2、禁止使用八進位制的常數和八進位制轉義字元。

sizeof

注意:sizeof在計算變數所佔空間大小時,括號可以省略,而計算型別(模子)大小時不能省略。

signed、unsigned

32位的signed int 型別整數,範圍:-231~(231-1);8位的char型別數,範圍:-27~(27-1)。
32位的unsigned int型別整數,範圍:0~(2^32-1);8位的unsigned char型別數,範圍:0~(2^8-1)。

 int main()
{
	signed char a[1000];
	int I;
	for(i=0; i<1000;i++)
	{
		a[i]=-1-i;
	
	}
	printf("%d",strlen(a));
	return 0;
	
}

其結果是255

float

四種射入方向:
1、像最接近的可表示的值;
2、當有兩個最接近的可表示的值時,首選“偶數”值;
3、向負無窮大(向下);
4、向正無窮大(向上)以及向0(截斷)。
五種型別的浮點異常是:無效運算、被零除、上溢、下溢和不精確。

else與if的配對

規定:else始終與同一括號內最接近的未匹配的if語句結合。
注意:if語句的後面不要加分號。
if語句的其他注意事項:
1、先處理正常情況,再處理異常情況。
2、確保if和else子句沒有弄反。
3、賦值運算子不能使用在產生布爾值的表示式上。
4、所有的if-else if結構應該由else子句結束。

Switch case

1、每個case語句的結尾絕對不要忘了加break,否則將導致多個分支重疊(除非有意使多個分支重疊)。
2、最後必須使用default分支。
3、再switch case組合中,禁止使用return語句。
4、switch表示式不應是有效的布林值。
case語句的排列順序:
1、按字母或數字順序排列各條case語句。
2、把正常情況放在前面,而把異常情況放在後面。
3、按執行頻率pailiecase語句。

do、while、for

while迴圈:先判斷while後面括號裡的值,如果為真則執行其後面的程式碼;否則不執行。
break與continue的區別:
break關鍵字很重要,表示終止本層迴圈。
continue表示終止本次(本輪)迴圈。
迴圈語句的注意點:
1、在多重迴圈中,如果有可能,應當將最長的迴圈放在最內層,最短的迴圈放在最外層,以減少CPU跨切迴圈層的次數。
2、建議for語句的迴圈控制變數的取值採用“半開半閉區間”。
3、不能在for迴圈體內修改迴圈變數,防止迴圈失控。
4、迴圈要儘可能短,要是程式碼清晰,一目瞭然。
5、把迴圈巢狀控制在3層以內。
6、for語句的控制表示式不能包含任何浮點型別的物件。

void

void是空型別,“void* ”為空型別指標。
例如:

float *p1;
int *p2;
 p1=p2 ;

其中p1=p2語句會出錯因該改成p1=(float*)p2;
用void就不同了

void*p1;
int*p2;
p1=p2;

注意:空型別可以包容有型別,有型別則不能包容空型別。
void也可以修飾函式的返回值和引數
1、如果函式沒有返回值,則將其宣告為void型別。
2、如果函式無引數,那麼應宣告其引數為void。
3、void不能代表一個真實的變數。

return

return用來終止一個函式並返回其後面跟著的值。
1、return語句不可返回指向“棧記憶體”的“指標”,因為該記憶體在函式體結束時被自動銷燬。

const

const只讀變數,具有不可變性。
例如:

const int Max=100;
 int  Array[Max];

注意:const修飾的只讀變數必須哎定義的同時初始化。
const修飾符也可以修飾函式的返回值,返回值不可改變。
const int Fun(void);
在另一連結檔案中引用const只讀變數:

extern const int i;//正確的宣告
extern const int j=10;//錯誤,只讀變數的值不能改變

注意:這裡是宣告不是定義

volatile

volatile是修飾符,用它修飾的變量表示
可以被某些編譯器未知的因素更改。
volatile這個關鍵字宣告的變數,編譯器對訪問該變數的程式碼就不再進行優化,從而可以提供對特殊地址的穩定訪問。

struct

struct是定義結構體的。
柔性陣列:c99中,結構中的最後一個元素允許是未知大小的陣列,這就叫做柔性陣列成員,但結構中的柔性陣列成員前面必須至少有一個其他成員。
柔性陣列的使用:

typedef struct st_type
{
	int i;
	int a[];
}type_a;

struct與class的區別:struct的成員預設情況下的屬性是public,而class成員的卻是private。

union

union維護足夠的空間來放置多個數據成員中的“一種”,而不是為每一個數據成員配置空間。
在union中所有的資料成員共用一個空間,同一時間只能儲存其中一個數據成員,所有的資料成員具有相同的起始地址。
例如:

union StateMachine
{
	char character;
	int number;
	char *str;
	double exp;
};

對於位域主要有以下兩種用法:
1、訪問較大資料型別中個別bit,或者一組bit(與union型別一起)。
2、允許將標誌位或者其他短長度的資料壓縮放置以節省空間。
位域本省有如下特點:
1、位域總是從字的第一個位開始。
2、位域不能與整數的邊界重疊,也就是說一個結構中的所有域的長度之和不能大於欄位大小。(如果更大,重疊域將欄位作為下一個字的開始)
3、可以給未命名的域宣告大小。
4、欄位中可以有未使用的位。
5、不能使用位域變數的地址,意味著不能使用scanf函式將數字讀入位域。
6、也不能使用位域變數的地址方式訪問位域。
7、位域不能陣列化。
8、位域必須進行賦值,且其值必須在位域的大小範圍之內,如果賦值過大將發生不可預知的錯誤。
9、位域定義中的資料型別如果是signed,則其位於不能少於兩位。(其中一位表示符號位)

enum

enum enum_type_name
{
	ENUM_CONST_1,
	ENUM_CONST_2,
	…
	ENUM_CONST_n
}enum_variable_name;

enum是定義常量的。
列舉與#define巨集的區別:
1、#define巨集常量是在預編譯階段進行簡單替換;列舉常量則是在編譯的時候確定其值。
2、一般在偵錯程式裡,可以除錯列舉常量,但是不能除錯巨集常量。
3、列舉可以一次定義大量相關的常量,而#define巨集一次只能定義一個。

typedef

typedef的意思是給一個已經存在的資料型別(是型別不是變數)取一個別名,而非定義一個新的資料型別。
用typedef重新命名基本的資料型別,以代替原始的資料型別。