c語言static與const
⑴ 關於c語言auto變數和static變數區別
一、主體不同
1、auto變數:是一個C/C++語言存儲類型,僅在語句塊內部使用。
2、static變數:在計算機編程領域指在程序執行前系統就為之靜態分配存儲空間的一類變數。
二、作用域范圍不同
1、auto變數:初始化可為任何錶達式,其特點是當執行流程進入該語句塊的時候初始化可為任何錶達式。
2、static變數:針對某一源文件的以static聲明的文件級變數與函數的作用域只限於文件內(只在文件內可見),也即「內部連接」,因而可以用來限定變數的作用域。
三、特點不同
1、auto變數:具有自動存儲期的變數在進入聲明該變數的程序塊時被建立,它在該程序塊活動時存在,退出該程序塊時撤銷。
2、static變數:在函數內以static聲明的變數雖然與自動局部變數的作用域相同,但存儲空間是以靜態分配而非默認的自動分配方式獲取的,因而存儲空間所在區域不同。
⑵ c語言中const、static關鍵字的用法
const是constant的縮寫,「恆定不變」的意思。被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程序的健壯性。
const可以修飾變數,函數的入參,函數的返回值
static第一個作用:隱藏
當我們同時編譯多個文件時,所有未加static前綴的全局變數和函數都具有全局可見性。
static的第二個作用是保持變數內容的持久。存儲在靜態數據區的變數會在程序剛開始運行時就完成初始化,也是唯一的一次初始化。
static的第三個作用是默認初始化為0。其實全局變數也具備這一屬性,因為全局變數也存儲在靜態數據區。在靜態數據區,內存中所有的位元組默認值都是0x00,某些時候這一特點可以減少程序員的工作量。
⑶ c語言中const 與static的分析
const 僅僅是說在內存分配的同時就被初始化了,之後就不能更改了。
我覺得這分析不見得就對,使用全局的const變數固然能達到目的,但是太多的全局變數造成的結果是職責不明確,程序邏輯令人費解。更好的做法是,它適合在哪裡就在哪裡,比如有一個Circle類表示圓,裡面有個const static double PI(static的目的是為了所有該類對象共享這個變數,否則會為每個該類的對象分配一個pi),表示圓周率,我覺得放在Circle類中是很合理,但是把它作為全局變數,在小程序里固然還是結果清晰,一旦程序大了,分成好幾十個文件了,邏輯就亂了
⑷ C++面相對象的static const成員變數有什麼作用是靜態常量,不是單獨的const或者static。
靜態常量是類的變數的一種,首先是靜態的,表示其在程序開始的時候就有了內存,是屬於類的。
然後是常量,表示其值只能被賦一次。它是唯一可以這么賦值的成員函數,static const int a=11;
或者還能在類聲明外面賦值,const int ATest::a=111;
⑸ C語言中static,const和static const 的區別
來看個例子:
在第一次調用test()時,如果static int b沒有被我賦初值,也會被默認賦值成0。然後執行自增運算,所以輸出1。第二次調用test()時如果是普通的變數,則會被重新分配內存,但static類型的變數上次執行test函數之後沒有被釋放,而是保存在全局變數區,所以繼續加一變成2。
對比一下非static的變數會怎樣:
⑹ 關鍵字static、Const、Volatile的作用是什麼
在C語言中,關鍵字static有三個明顯的作用:
1). 在函數體,一個被聲明為靜態的變數在這一函數被調用過程中維持其值不變。
2). 在模塊內(但在函數體外),一個被聲明為靜態的變數可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變數。
3). 在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地范圍內使用。
大多數應試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是一個應試者的嚴重的缺點,因為他顯然不懂得本地化數
據和代碼范圍的好處和重要性。
我只要一聽到被面試者說:「const意味著常數」,我就知道我正在和一個業余者打交道。去年Dan Saks已經在他的文章里完全概括了const的所有用法,因此ESP(譯者:Embedded Systems Programming)的每一位讀者應該非常熟悉const能做什麼和不能做什麼.如果你從沒有讀到那篇文章,只要能說出const意味著「只讀」就可以了。盡管這個答案不是完全的答案,但我接受它作為一個正確的答案。(如果你想知道更詳細的答案,仔細讀一下Saks的文章吧。)如果應試者能正確回答這個問題,我將問他一個附加的問題:下面的聲明都是什麼意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前兩個的作用是一樣,a是一個常整型數。第三個意味著a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針可以)。第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的)。最後一個意味著a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)。如果應試者能正確回答這些問題,那麼他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關鍵字 const,也還是能很容易寫出功能正確的程序,那麼我為什麼還要如此看重關鍵字const呢?我也如下的幾下理由:
2). 通過給優化器一些附加的信息,使用關鍵字const也許能產生更緊湊的代碼。
3). 合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現。
一個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用保存在寄存器里的備份。下面是volatile變數的幾個例子:
1). 並行設備的硬體寄存器(如:狀態寄存器)
2). 一個中斷服務子程序中會訪問到的非自動變數(Non-automatic variables)
3). 多線程應用中被幾個任務共享的變數
假設被面試者正確地回答了這是問題(嗯,懷疑這否會是這樣),我將稍微深究一下,看一下這傢伙是不是直正懂得volatile完全的重要性。
int square(volatile int *ptr){return *ptr * *ptr;}下面是答案:
1). 是的。一個例子是只讀的狀態寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程序不應該試圖去修改它。
2). 是的。盡管這並不很常見。一個例子是當一個中服務子程序修該一個指向一個buffer的指針時。
3). 這段代碼的有個惡作劇。這段代碼的目的是用來返指針*ptr指向值的平方,但是,由於*ptr指向一個volatile型參數,編譯器將產生類似下面的代碼:
int square(volatile int *ptr){int a,b;a = *ptr;b = *ptr;return a * b;}由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:
⑺ const和static const的區別
const和static const的區別:
一、全局的區別
const規定變數在全局中是只讀的變數,並且它的值無法被修改。
static const規定變數在當前的模塊中是只讀的變數,無法再全局中被其他模塊讀取。
二、文件的區別
const定義的指針,不賦初值編譯時不報錯,在初始化時應說明指針的指向。
static const不能在定義對象時對變數初始化,就是不能用構造函數來初始化。
三、函數的區別
const只能通過構造函數初始化列表進行,並且必須有構造函數。
static const是靜態的,屬於類的靜態成員函數。
四、類的區別
const數據成員只在某個對象生存期內是常量,而對於整個類而言卻是可變的。因為類可以創建多個對象,不同的對象其const數據成員的值可以不同,所以不能在類聲明中初始化const數據成員。
static const初始化在類體外進行,初始化時不加該成員的訪問許可權控制符private,public等,並且初始化時使用作用域運算符來標明它所屬類,因此,靜態數據成員是類的成員,而不是對象的成員。
⑻ 關於C語言中return以及static const的問題
return作為一個函數的返回值的
而static const是定義靜態變數的
⑼ 在C語言中,register,const,static,extern分別都是什麼意思,有什麼用
register修飾符暗示編譯程序相應的變數將被頻繁地使用,如果可能的話,應將其保存在CPU的寄存器中,以加快其存儲速度。
const限定一個變數不允許被改變。使用const在一定程度上可以提高程序的安全性和可靠性,另外,在觀看別人代碼的時候,清晰理解const所起的作用,對理解對方的程序也有一些幫助。
static有兩種用法:面向過程程序設計中的static和面向對象程序設計中的static。前者應用於普通變數和函數,不涉及類;後者主要說明static在類中的作用。
extern可以置於變數或者函數前,以表示變數或者函數的定義在別的文件中,提示編譯器遇到此變數和函數時在其他模塊中尋找其定義。另外,extern也可用來進行鏈接指定。