国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C語言之auto、static、register、const、volatile、extern關鍵字

2019-11-08 01:46:24
字體:
來源:轉載
供稿:網友

(1)auto   這個這個關鍵字用于聲明變量的生存期為自動,即將不在任何類、結構、枚舉、聯合和函數中定義的變量視為全局變量,而在函數中定義的變量視為局部變量。這個關鍵字不怎么多寫,因為所有的變量默認就是auto的。(2)register   這個關鍵字命令編譯器盡可能的將變量存在CPU內部寄存器中而不是通過內存尋址訪問以提高效率。(3)static   常見的兩種用途:     1>統計函數被調用的次數;     2>減少局部數組建立和賦值的開銷.變量的建立和賦值是需要一定的處理器開銷的,特別是數組等含有較多元素的存儲類型。在一些含有較多的變量并且被經常調用的函數中,可以將一些數組聲明為static類型,以減少建立或者初始化這些變量的開銷.   詳細說明:     1>、變量會被放在程序的全局存儲區中,這樣可以在下一次調用的時候還可以保持原來的賦值。這一點是它與堆棧變量和堆變量的區別。     2>、變量用static告知編譯器,自己僅僅在變量的作用范圍內可見。這一點是它與全局變量的區別。     3>當static用來修飾全局變量時,它就改變了全局變量的作用域,使其不能被別的程序extern,限制在了當前文件里,但是沒有改變其存放位置,還是在全局靜態儲存區。  使用注意:     1>若全局變量僅在單個C文件中訪問,則可以將這個變量修改為靜態全局變量,以降低模塊間的耦合度;     2>若全局變量僅由單個函數訪問,則可以將這個變量改為該函數的靜態局部變量,以降低模塊間的耦合度;     3>設計和使用訪問動態全局變量、靜態全局變量、靜態局部變量的函數時,需要考慮重入問題(只要輸入數據相同就應產生相同的輸出)。(4)const   被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程序的健壯性。它可以修飾函數的參數、返回值,甚至函數的定義體。   作用:     1>修飾輸入參數       a.對于非內部數據類型的輸入參數,應該將“值傳遞”的方式改為“const引用傳遞”,目的是提高效率。例如將void Func(A a) 改為void Func(const A &a)。       b.對于內部數據類型的輸入參數,不要將“值傳遞”的方式改為“const引用傳遞”。否則既達不到提高效率的目的,又降低了函數的可理解性。例如void Func(int x) 不應該改為void Func(const int &x)。     2>用const修飾函數的返回值       a.如果給以“指針傳遞”方式的函數返回值加const修飾,那么函數返回值(即指針)的內容不能被修改,該返回值只能被賦給加const修飾的同類型指針。        如對于: const char * GetString(void);        如下語句將出現編譯錯誤:         char *str = GetString();//cannot convert from 'const char *' to 'char *';        正確的用法是:       const char *str = GetString();       b.如果函數返回值采用“值傳遞方式”,由于函數會把返回值復制到外部臨時的存儲單元中,加const修飾沒有任何價值。 如不要把函數int GetInt(void) 寫成const int GetInt(void)。     3>const成員函數的聲明中,const關鍵字只能放在函數聲明的尾部,表示該類成員不修改對象.    說明:     const type m; //修飾m為不可改變    示例:     typedef char * pStr; //新的類型pStr;     char string[4] = "abc";     const char *p1 = string;     p1++; //正確,上邊修飾的是*p1,p1可變     const pStr p2 = string;     p2++; //錯誤,上邊修飾的是p2,p2不可變,*p2可變    同理,const修飾指針時用此原則判斷就不會混淆了。     const int *value; //*value不可變,value可變     int* const value; //value不可變,*value可變     const (int *) value; //(int *)是一種type,value不可變,*value可變               //邏輯上這樣理解,編譯不能通過,需要tydef int* NewType;     const int* const value;//*value,value都不可變(5)volatile   表明某個變量的值可能在外部被改變,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。它可以適用于基礎類型如:int,char,long......也適用于C的結構和C++的類。當對結構或者類對象使用volatile修飾的時候,結構或者類的所有成員都會被視為volatile.   該關鍵字在多線程環境下經常使用,因為在編寫多線程的程序時,同一個變量可能被多個線程修改,而程序通過該變量同步各個線程。   簡單示例:    

DWord __stdcall threadFunc(LPVOID signal)   {     int* intSignal=reinterPRet_cast(signal);     *intSignal=2;     while(*intSignal!=1)     sleep(1000);     return 0;   }

  該線程啟動時將intSignal 置為2,然后循環等待直到intSignal 為1 時退出。顯然intSignal的值必須在外部被改變,否則該線程不會退出。但是實際運行的時候該線程卻不會退出,即使在外部將它的值改為1,看一下對應的偽匯編代碼就明白了:      mov ax,signal      label:      if(ax!=1)      goto label   對于C編譯器來說,它并不知道這個值會被其他線程修改。自然就把它cache在寄存器里面。C 編譯器是沒有線程概念的,這時候就需要用到volatile。volatile 的本意是指:這個值可能會在當前線程外部被改變。也就是說,我們要在threadFunc中的intSignal前面加上volatile關鍵字,這時候,編譯器知道該變量的值會在外部改變,因此每次訪問該變量時會重新讀取,所作的循環變為如下面偽碼所示:label:      mov ax,signal      if(ax!=1)      goto label   注意:一個參數既可以是const同時是volatile,是volatile因為它可能被意想不到地改變。它是const因為程序不應該試圖去修改它。 (6)extern   extern 意為“外來的”···它的作用在于告訴編譯器:有這個變量,它可能不存在當前的文件中,但它肯定要存在于工程中的某一個源文件中或者一個Dll的輸出中。下面關于C++的幾個關鍵字是經常和我們打交道的而我們又經常對這些含糊不清的,本文根據自己的學習體會作以總結,以期達到真正理解和活用的目的。staticl           靜態變量作用范圍在一個文件內,程序開始時分配空間,結束時釋放空間,默認初始化為0,使用時可改變其值。 l           靜態變量或靜態函數,即只有本文件內的代碼才可訪問它,它的名字(變量名或函數名)在其它文件中不可見。l           在函數體內生成的靜態變量它的值也只能維持

int max_so_far( int curr )//求至今(本次調用)為止最大值{     static int biggest; //該變量保持著每次調用時的最新值,它的有效期等于整個程序的有效期     if( curr > biggest )        biggest = curr;     return biggest;}

l           在C++類的成員變量被聲明為static(稱為靜態成員變量),意味著它為該類的所有實例所共享,也就是說當某個類的實例修改了該靜態成員變量,其修改值為該類的其它所有實例所見;而類的靜態成員函數也只能訪問靜態成員(變量或函數)。 l           類的靜態成員變量必須在聲明它的文件范圍內進行初始化才能使用,private類型的也不例外。如,                 float SavingsAccount::currentRate = 0.00154;     (注:currentRate是類SavingsAccount的靜態成員變量)registerl           用register聲明的變量稱著寄存器變量,在可能的情況下會直接存放在機器的寄存器中;但對32位編譯器不起作用,當global optimizations(全局優化)開的時候,它會做出選擇是否放在自己的寄存器中;不過其它與register關鍵字有關的其它符號都對32位編譯器有效。 autol           它是存儲類型標識符,表明變量(自動)具有本地范圍,塊范圍的變量聲明(如for循環體內的變量聲明)默認為auto存儲類型。 externl           聲明變量或函數為外部鏈接,即該變量或函數名在其它文件中可見。被其修飾的變量(外部變量)是靜態分配空間的,即程序開始時分配,結束時釋放。用其聲明的變量或函數應該在別的文件或同一文件的其它地方定義(實現)。在文件內聲明一個變量或函數默認為可被外部使用。l           在C++中,還可用來指定使用另一語言進行鏈接,這時需要與特定的轉換符一起使用。目前Microsoft C/C++僅支持”C”轉換標記,來支持C編譯器鏈接。使用這種情況有兩種形式:u         extern “C” 聲明語句u         extern “C” { 聲明語句塊 }volatilel           限定一個對象可被外部進程(操作系統、硬件或并發線程等)改變,聲明時的語法如下:int volatile nVint;          這樣的聲明是不能達到最高效的,因為它們的值隨時會改變,系統在需要時會經常讀寫這個對象的值。         只常用于像中斷處理程序之類的異步進程進行內存單元訪問。constconst所修飾的對象或變量不能被改變,修飾函數時,該函數不能改變在該函數外面聲明的變量也不能調用任何非const函數。在函數的聲明與定義時都要加上const,放在函數參數列表的最后一個括號后。 l           在C++中,用const聲明一個變量,意味著該變量就是一個帶類型的常量,可以代替#define,且比#define多一個類型信息,且它執行內鏈接,可放在頭文件中聲明;但在C中,其聲明則必須放在源文件(即.C文件)中,在C中const聲明一個變量,除了不能改變其值外,它仍是一具變量,如 const int maxarray = 255; it55.com char store_char[maxarray];    //C++中合法,C中不合法 l           const修飾指針時要特別注意。例:

char *const aptr = mybuf;    // 常量指針*aptr = 'a';         // Legalaptr = yourbuf;      // Errorconst char *bptr = mybuf;    // (指針bptr)指向常量數據*bptr = 'a';         // Errorbptr = yourbuf;      // Legal

l           const修飾成員函數時不能用于構造和析構函數。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 五峰| 郴州市| 大英县| 吉木乃县| 湘西| 南通市| 新余市| 新平| 应城市| 新疆| 扎囊县| 夏邑县| 霍山县| 兖州市| 姚安县| 红桥区| 内丘县| 温宿县| 泸定县| 光泽县| 临泉县| 东乡| 集贤县| 平昌县| 陆川县| 甘肃省| 阿鲁科尔沁旗| 威海市| 洛南县| 五峰| 尼勒克县| 南投县| 芒康县| 靖州| 怀宁县| 宝清县| 邵武市| 元氏县| 芜湖县| 商丘市| 吉隆县|