C語言基礎面試題之關鍵字

2021-09-11 21:27:13 字數 2721 閱讀 5205

static關鍵字的作用是什麼?

這個簡單的問題很少有人能回答完全。在c語言中,關鍵字static有三個明顯的作用:

1)在函式體中,乙個被宣告為靜態的變數在這一函式被呼叫過程中維持其值不變。

2)在模組內(但在函式體外),乙個被宣告為靜態的變數可以被模組內所有函式訪問,但不能被模組外其他函式訪問。他是乙個本地的全域性變數。

3)在模組內,乙個被宣告為靜態的函式只可能被這一模組內的其他函式呼叫,那就是這個函式被限制在宣告它的模組的本地範圍內使用。

static全域性變數與普通的全域性變數有什麼區別?static區域性變數和普通區域性變數有什麼區別?static函式與普通函式有什麼區別?

全域性變數(外部變數)的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別雖在於非靜態全域性變數的作用域是整個源程式, 當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它。由於靜態全域性變數的作用域侷限於乙個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其它原始檔中引起錯誤。

從以上分析可以看出, 把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數後是改變了它的作用域, 限制了它的使用範圍。

static函式與普通函式作用域不同。僅在本檔案。只在當前原始檔中使用的函式應該說明為內部函式(static),內部函式應該在當前原始檔中說明和定義。

對於可在當前原始檔以外使用的函式,應該在乙個標頭檔案中說明,要使用這些函式的原始檔要包含這個標頭檔案

static全域性變數與普通的全域性變數有什麼區別:static全域性變數只初使化一次,防止在其他檔案單元中被引用;

static區域性變數和普通區域性變數有什麼區別:static區域性變數只被初始化一次,下一次依據上一次結果值;

static函式與普通函式有什麼區別:static函式在記憶體中只有乙份,普通函式在每個被呼叫中維持乙份拷貝。

const int a; 

int const a;

//前兩個的作用是一樣,a是乙個常整型數。

const int *a;

//a是乙個指向常整型數的指標(也就是,整型數是不可修改的,但指標可以

int *

const a;

//a是乙個指向整型數的常指標 (也就是說,指標指向的整型數是可以修改的,但指標是不可修改的)

int const

* a const

;//a是乙個指向常整型數的常指標(也就是說,指標指向的整型數是不可修改的,同時指標也是不可修改的)

為何用const:

1). 關鍵字const的作用,告訴別人是唯讀的常量。

2). 通過給優化器一些附加的資訊,使用關鍵字const也許能產生更緊湊的**。

3). 合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的引數,防止其被無意的**修改。簡而言之,這樣可以減少bug的出現。

乙個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。下面是volatile變數的幾個例子:

1). 並行裝置的硬體暫存器(如:狀態暫存器)

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

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

用預處理指令#define 宣告乙個常數,用以表明1年中有多少秒(忽略閏年問題)

#define seconds_per_year (60 * 60 * 24 * 365)ul
我在這想看到幾件事情:

1). #define 語法的基本知識(例如:不能以分號結束,括號的使用,等等)

2). 懂得預處理器將為你計算常數表示式的值,因此,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。

3). 意識到這個表示式將使乙個16位機的整型數溢位-因此要用到長整型符號l,告訴編譯器這個常數是的長整型數。

4). 如果你在你的表示式中用到ul(表示無符號長整型),那麼你有了乙個好的起點。記住,第一印象很重要。

寫乙個「標準」巨集,這個巨集輸入兩個引數並返回較小的乙個

#define min(x, y) ((x)>(y)?(y):(x))     //巨集中小心地把引數用括號括起來
不用中間變數,實現兩變數的交換
#define swap(x,y) \

x=x+y;\

y=x-y;\

x=x-y //注意:結尾沒有分號

const與#define 相比,有何優點?

const 常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查。而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換可能會產生意料不到的錯誤。

有些整合化的除錯工具可以對const 常量進行除錯,但是不能對巨集常量進行除錯。

inline 和define 對比

inline**放入預編譯器符號表中,高效;它是個真正的函式,呼叫時有嚴格的引數檢測。

面試點 關鍵字const C語言面試題分析之四

面試點 關鍵字const c 語言面試題分析之四 const int i 5 int j 0 i j 非法,導致編譯錯誤 j i 合法const int i 5 合法const int j 非法,導致編譯錯誤 extern const int i 合法extern const int j 10 非法...

面試題 final關鍵字

對於final域,編譯器和處理器要遵守兩個重排序規則 1.在建構函式內對乙個final域的寫入,與隨後把這個被構造物件的引用賦值給乙個引用變數,這兩個操作之間不能重排序。原因 編譯器會在final域的寫之後,發現 final 變數的賦值也會通過 putfield 指令來完成,插入乙個storesto...

面試題 final關鍵字

對於final域,編譯器和處理器要遵守兩個重排序規則 1.在建構函式內對乙個final域的寫入,與隨後把這個被構造物件的引用賦值給乙個引用變數,這兩個操作之間不能重排序。原因 編譯器會在final域的寫之後,發現 final 變數的賦值也會通過 putfield 指令來完成,插入乙個storesto...