c與c 關鍵字的用法總結

2021-07-03 16:39:07 字數 3435 閱讀 2838

/*

1,關鍵字的總結

register:

(1),這個關鍵字請求編譯器盡可能的將變數存在cpu內部暫存器中,而不是通過記憶體定址訪問,以提高效率。

const:

(1),const修飾變數,以下兩種定義形式在本質上是一樣的。它的含義是:const修飾的型別為type的變數value是不可變的。

type const valuename = value; 

const type valuename = value;

(2),將const改為外部連線,作用於擴大至全域性,編譯時會分配記憶體,並且可以不進行初始化,僅僅作為宣告,編譯器認為在程式其他地方進行了定義.

extend const int valuename = value;

(3),const建立的全域性變數不能修改,const建立的臨時變數可以修改:

例如:const int n=10;

void main()

(9),const 修飾函式返回值

const修飾函式返回值其實用的並不是很多,它的含義和const修飾普通變數以及指標的含義基本相同。

a.const int fun1() //這個其實無意義,因為引數返回本身就是賦值。

b. const int * fun2() //呼叫時 const int *pvalue = fun2();

//我們可以把fun2()看作成乙個變數,即指標內容不可變。

c.int* const fun3()   //呼叫時 int * const pvalue = fun2();

//我們可以把fun2()看作成乙個變數,即指標本身不可變。

3,static:

c語言中:

(1)在c語言中,static可以用來修飾區域性變數,全域性變數以及函式。在不同的情況下static的作用不盡相同。

(2)修飾區域性變數

一般情況下,對於區域性變數是存放在棧區的,並且區域性變數的生命週期在該語句塊執行結束時便結束了。但是如果用static進行修飾的話,該變數便存放在靜態資料區,其生命週期一直持續到整個程式執行結束。但是在這裡要注意的是,雖然用static對區域性變數進行修飾過後,其生命週期以及儲存空間發生了變化,但是其作用域並沒有改變,其仍然是乙個區域性變數,作用域僅限於該語句塊。

在用static修飾區域性變數後,該變數只在初次執行時進行初始化工作,且只進行一次。

如:#include

void fun()  

int main(void)  

程式執行結果為: 2  3

說明在第二次呼叫fun()函式時,a的值為2,並且沒有進行初始化賦值,直接進行自運算,所以得到的結果為3.

對於靜態區域性變數如果沒有進行初始化的話,對於整形變數系統會自動對其賦值為0,對於字元陣列,會自動賦值為'\0'.

(3)修飾全域性變數

對於乙個全域性變數,它既可以在本原始檔中被訪問到,也可以在同乙個工程的其它原始檔中被訪問(只需用extern進行宣告即可)。

如: int a=1;  

file2.c  

#include

extern int a;  

int main(void)  

則執行結果為 1

但是如果在file1.c中把int a=1改為static int a=1;

那麼在file2.c是無法訪問到變數a的。原因在於用static對全域性變數進行修飾改變了其作用域的範圍,由原來的整個工程可見變為本原始檔可見。

(3)修飾函式

用static修飾函式的話,情況與修飾全域性變數大同小異,就是改變了函式的作用域。

c++中:

在c++中static還具有其它功能,如果在c++中對類中的某個函式用static進行修飾,則表示該函式屬於乙個類而不是屬於此類的任何特定物件;如果對類中的某個變數進行static修飾,表示該變數為類以及其所有的物件所有。它們在儲存空間中都只存在乙個副本。可以通過類和物件去呼叫。

4,volatile:

(1),volatile int const n=10;

編譯器不會對n進行優化,

volatile int i=10;

int j = i;

...int k = i;volatile 告訴編譯器i是隨時可能發生變化的,每次使用它的時候必須從i的位址中讀取,因而編譯器生成的可執行碼會重新從i的位址讀取資料放在k中

建議使用volatile變數的場所:

(1) 並行裝置的硬體暫存器

(2) 乙個中斷服務子程式中會訪問到的非自動變數(全域性變數)

(3) 多執行緒應用中被幾個任務共享的變數

5.typedef:

(1),typedef可以對程式進行一定的優化,例如

定義結構體:

struct stu

定義乙個新的物件為:struct stu stu1;

如果使用typedef:

則:typedef struct stu stu;

可以:stu stu1;

(2);可以定義乙個函式指標:

typedef int(*pfun)(int a,int b,int c)

則*pfun 就是乙個函式指標:

6,define:

(1).簡單的define定義

#define maxtime 1000

乙個簡單的maxtime就定義好了,它代表1000,如果在程式裡面寫

編譯器在處理這個**之前會對maxtime進行處理替換為1000。

這樣的定義看起來類似於普通的常量定義const,但也有著不同,因為define的定義更像是簡單的文字替換,

(2),define可以像函式那樣接受一些引數,如下

#define max(x,y) (x)>(y)?(x):(y);

這個定義就將返回兩個數中較大的那個,看到了嗎?因為這個「函式」沒有型別檢查,就好像乙個函式模板似的,當然,它絕對沒有模板那麼安全就是了。可以作為乙個簡單的模板來使用而已。

(3).在大規模的開發過程中,特別是跨平台和系統的軟體裡,define最重要的功能是條件編譯。

就是:#ifdef windows

......

......

#endif

#ifdef linux

......

......

#endif

(4),5.如何定義巨集、取消巨集

//定義巨集

#define [macroname] [macrovalue]

//取消巨集

#undef [macroname]

//普通巨集

#define pi (3.1415926)

帶引數的巨集

#define max(a,b) ((a)>(b)? (a),(b))

(5),防止乙個標頭檔案被重複包含

#ifndef comdef_h

#define comdef_h

//標頭檔案內容

#endif

*/

關鍵字的用法 C 中const關鍵字用法總結

ark2000 看完了c primer的基礎篇,對const還是有點陌生,在這裡小小地總結一下吧。在變數的定義前加上const修飾符即可完成const物件的建立。const int val 5 const變數的值不能改變。val 5 error assignment of read only var...

C 關鍵字總結

const 與define define是預編譯器的編譯指令,它從c語言相容下來,工作方式與文字編輯器中的全域性搜尋和替換相似。define定義的常量的意義在它開始的地方持續到檔案結束,在預編譯階段,預編譯器已經將所有define刪除,並展開所有的巨集定義。它單純只做文字替換,沒有型別安全檢查,de...

C 中static關鍵字的用法總結

1.全域性靜態變數 在全域性變數前加上關鍵字static,全域性變數就定義成乙個全域性靜態變數,這 改變了它的作用域 未加static字首的全域性變數和函式預設省略 extern,都具有全域性可見性 儲存及生命週期 在靜態儲存區,整個程式執行期間一直存在。初始化 未經初始化的全域性靜態變數是會被自動...