關鍵字static、const、volatile的作用

來源:互聯網
上載者:User

關鍵字static的作用是什嗎?
這個簡單的問題很少有人能回答完全。在C語言中,關鍵字static有三個明顯的作用:
1、在函數體,一個被聲明為靜態變數在這一函數被調用過程中維持其值不變。
2、 在模組內(但在函數體外),一個被聲明為靜態變數可以被模組內所有函數訪問,但不能被模組外其它函數訪問。它是一個本地的全域變數。
3、在模組內,一個被聲明為靜態函數只可被這一模組內的其它函數調用。那就是,這個函數被限制在聲明它的模組的本地範圍內使用。
大多數應試者能正確回答第一部分,一部分能正確回答第二部分,但是很少的人能懂得第三部分。做為一個合格的軟體工程師,我們要懂得第三部分的作用,要懂得本地化資料和代碼範圍的好處和重要性。

int testStatic()
{
 int x=1;
 x++;
 return x;
}
main()
{
 int i;
 for(i=0;i<5;i++)
 printf("%d/n",testStatic());
}

輸出為:

2

2

2

2

2

 

int testStatic()
{
 static  int x=1;
 x++;
 return x;
}
main()
{
 int i;
 for(i=0;i<5;i++)
 printf("%d/n",testStatic());
}

輸出為:

2

3

4

5

6

const 有什麼用途?

(1)可以定義
const 常量

(2)const可以修飾函數的參數、傳回值,甚至函數的定義體。被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性。
  const意味著"唯讀"。區別如下代碼的功能非常重要。

 

const int a;
int const a;
const int *a;
int * const a;
int const * a const;

 

  • 前兩個作用是一樣的,a是一個常整型數。
  • 第三個意味著a是一個指向常整型數的指標(也就是,整型數是不可修改的,但指標可以)。
  • 第四個意思是a是一個指向整型數的常指標(也就是,指標指向的整型數是可以修改的,但指標是不可修改的)。
  • 最後一個意味著a是一個指向常整型數的常指標(也就是,指標指向的整型數是不可修改的,同時指標也是不可修改的)。

  (1)關鍵字const的作用是為給讀你代碼的人傳達非常有用的資訊。例如,在函數的形參前添加const關鍵字意味著這個參數在函數體內不會被修改,屬於"輸入參數"。在有多個形參的時候,函數的調用者可以憑藉參數前是否有const關鍵字,清晰的辨別哪些是輸入參數,哪些是可能的輸出參數。

  (2)合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改,這樣可以減少bug的出現。

  const在C++語言中則包含了更豐富的含義,而在C語言中僅意味著:"只能讀的普通變數",可以稱其為"不能改變的變數"(這個說法似乎很拗口,但卻最準確的表達了C語言中const的本質),在編譯階段需要的常數仍然只能以#define宏定義!故在C語言中如下程式是非法的:

const int SIZE = 10;
char a[SIZE]; /* 非法:編譯階段不能用到變數 */

 

以下是工作中的使用const例子:

const unsigned char *  pbyData;

unsigned char const DayPerMonth[12] = { 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 } ;

extern void dp_write_dsp_block ( const word *bp, word len );

const unsigned short  cnstUni2InterMapSparseIdx[];

 

 

volatile問題:

volatile的文法與const是一樣的,但是volatile的意思是“在編譯器認識的範圍外,這個資料可以被改變”。不知何故,環境正在改變資料(可能通過多任務處理),所以,volatile告訴編譯器不要擅自作出有關資料的任何假設——在最佳化起家這是特別重要的。如果編譯器說:“我已經吧資料讀入寄存器,而且在沒有與寄存器接觸。”在一般情況下,它不需要再讀入這個資料。但是,如果資料是volatile修飾的,編譯器則是不能做出這樣的假定,因為資料可能被其他進程改變了,編譯器必須重新讀這個資料而不是最佳化這個代碼。就像建立const對象一樣,程式員也可以建立volatile對象,甚至還建立const
volatile對象。這個對象不能被程式員改變,但可通過外面的工具改變。

    volatile對象每次被訪問時必須重新讀取這個變數的值,而不是用儲存在寄存器中的備份。下面時volatile變數的幾個例子:

    .平行裝置的硬體寄存器(如狀態寄存器);

    .一個中斷服務子程式中會訪問到的非自動變數(Non-automatic variables);

    .多現成應用中被幾個任務共用的變數。

一個參數可以const同時也是volatile,一個指標也是可以為volatile的,但是具體編程時要小心,要保證不被意外修改。

關鍵字static的作用是什嗎?
這個簡單的問題很少有人能回答完全。在C語言中,關鍵字static有三個明顯的作用:
1、在函數體,一個被聲明為靜態變數在這一函數被調用過程中維持其值不變。
2、 在模組內(但在函數體外),一個被聲明為靜態變數可以被模組內所有函數訪問,但不能被模組外其它函數訪問。它是一個本地的全域變數。
3、在模組內,一個被聲明為靜態函數只可被這一模組內的其它函數調用。那就是,這個函數被限制在聲明它的模組的本地範圍內使用。
大多數應試者能正確回答第一部分,一部分能正確回答第二部分,但是很少的人能懂得第三部分。做為一個合格的軟體工程師,我們要懂得第三部分的作用,要懂得本地化資料和代碼範圍的好處和重要性。

int testStatic()
{
 int x=1;
 x++;
 return x;
}
main()
{
 int i;
 for(i=0;i<5;i++)
 printf("%d/n",testStatic());
}

輸出為:

2

2

2

2

2

 

int testStatic()
{
 static  int x=1;
 x++;
 return x;
}
main()
{
 int i;
 for(i=0;i<5;i++)
 printf("%d/n",testStatic());
}

輸出為:

2

3

4

5

6

const 有什麼用途?

(1)可以定義
const 常量

(2)const可以修飾函數的參數、傳回值,甚至函數的定義體。被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性。
  const意味著"唯讀"。區別如下代碼的功能非常重要。

 

const int a;
int const a;
const int *a;
int * const a;
int const * a const;

 

  • 前兩個作用是一樣的,a是一個常整型數。
  • 第三個意味著a是一個指向常整型數的指標(也就是,整型數是不可修改的,但指標可以)。
  • 第四個意思是a是一個指向整型數的常指標(也就是,指標指向的整型數是可以修改的,但指標是不可修改的)。
  • 最後一個意味著a是一個指向常整型數的常指標(也就是,指標指向的整型數是不可修改的,同時指標也是不可修改的)。

  (1)關鍵字const的作用是為給讀你代碼的人傳達非常有用的資訊。例如,在函數的形參前添加const關鍵字意味著這個參數在函數體內不會被修改,屬於"輸入參數"。在有多個形參的時候,函數的調用者可以憑藉參數前是否有const關鍵字,清晰的辨別哪些是輸入參數,哪些是可能的輸出參數。

  (2)合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改,這樣可以減少bug的出現。

  const在C++語言中則包含了更豐富的含義,而在C語言中僅意味著:"只能讀的普通變數",可以稱其為"不能改變的變數"(這個說法似乎很拗口,但卻最準確的表達了C語言中const的本質),在編譯階段需要的常數仍然只能以#define宏定義!故在C語言中如下程式是非法的:

const int SIZE = 10;
char a[SIZE]; /* 非法:編譯階段不能用到變數 */

 

以下是工作中的使用const例子:

const unsigned char *  pbyData;

unsigned char const DayPerMonth[12] = { 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 } ;

extern void dp_write_dsp_block ( const word *bp, word len );

const unsigned short  cnstUni2InterMapSparseIdx[];

 

 

volatile問題:

volatile的文法與const是一樣的,但是volatile的意思是“在編譯器認識的範圍外,這個資料可以被改變”。不知何故,環境正在改變資料(可能通過多任務處理),所以,volatile告訴編譯器不要擅自作出有關資料的任何假設——在最佳化起家這是特別重要的。如果編譯器說:“我已經吧資料讀入寄存器,而且在沒有與寄存器接觸。”在一般情況下,它不需要再讀入這個資料。但是,如果資料是volatile修飾的,編譯器則是不能做出這樣的假定,因為資料可能被其他進程改變了,編譯器必須重新讀這個資料而不是最佳化這個代碼。就像建立const對象一樣,程式員也可以建立volatile對象,甚至還建立const
volatile對象。這個對象不能被程式員改變,但可通過外面的工具改變。

    volatile對象每次被訪問時必須重新讀取這個變數的值,而不是用儲存在寄存器中的備份。下面時volatile變數的幾個例子:

    .平行裝置的硬體寄存器(如狀態寄存器);

    .一個中斷服務子程式中會訪問到的非自動變數(Non-automatic variables);

    .多現成應用中被幾個任務共用的變數。

一個參數可以const同時也是volatile,一個指標也是可以為volatile的,但是具體編程時要小心,要保證不被意外修改。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.