C 變數和常量

2021-08-29 13:53:09 字數 3889 閱讀 6088

定義的時候系統不會初始化,其值為任意

定義全部變數系統為其預設初始化

int0

char

'\0'

float

0double

0pointer

null

前提條件是需要用{}括起來

比如下面的**就是對的,但是printf輸出的是a=10

#include using namespace std;

int main()

return 0;

}

#include using namespace std;

int main()

全域性變數和和區域性變數同名時,可通過網域名稱在函式中引用到全域性變數,不加網域名稱解析則引用區域性變數

#includeusing namespace std;

int a = 10;

int main()

作用域可分為 6 種:全域性作用域區域性作用域語句作用域類作用域命名空間作用域和檔案作用域

從作用域看:

全域性變數具有全域性作用域。全域性變數只需在乙個原始檔中定義,就可以作用於所有的原始檔。當然,其他不包含全域性變數定義的原始檔需要用extern 關鍵字再次宣告這個全域性變數。

靜態區域性變數具有區域性作用域,它只被初始化一次,自從第一次被初始化直到程式執行結束都一直存在,它和全域性變數的區別在於全域性變數對所有的函式都是可見的,而靜態區域性變數只對定義自己的函式體始終可見。

區域性變數也只有區域性作用域,它是自動物件(auto),它在程式執行期間不是一直存在,而是只在函式執行期間存在,函式的一次呼叫執行結束後,變數被撤銷,其所占用的記憶體也被收回。

靜態全域性變數也具有全域性作用域,它與全域性變數的區別在於如果程式包含多個檔案的話,它作用於定義它的檔案裡,不能作用到其它檔案裡,即被static關鍵字修飾過的變數具有檔案作用域。這樣即使兩個不同的原始檔都定義了相同名字的靜態全域性變數,它們也是不同的變數。

從分配記憶體空間看:

全域性變數,靜態區域性變數,靜態全域性變數都在靜態儲存區分配空間,而區域性變數在棧裡分配空間。

全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。

從以上分析可以看出, 把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數後是改變了它的作用域,限制了它的使用範圍。因此static 這個說明符在不同的地方所起的作用是不同的。應予以注意。

tips:

static 全域性變數:改變作用範圍,不改變儲存位置

static 區域性變數:改變儲存位置,不改變作用範圍

靜態函式:在函式的返回型別前加上static關鍵字,函式即被定義為靜態函式。靜態函式與普通函式不同,它只能在宣告它的檔案當中可見,不能被其它檔案使用。

如果在乙個原始檔中定義的函式,只能被本檔案中的函式呼叫,而不能被同一程式其它檔案中的函式呼叫,這種函式也稱為內部函式。定義乙個內部函式,只需在函式型別前再加乙個「static」關鍵字即可。

(1) 使用#define預處理器

#define identifier value
(2) 使用const關鍵字

const字首宣告指定型別的常量(唯讀,不能修改)

const type variable = value
型別和安全檢查不同

巨集定義是字元替換,沒有資料型別的區別,同時這種替換沒有型別安全檢查,可能產生邊際效應等錯誤;

const常量是常量的宣告,有型別區別,需要在編譯階段進行型別檢查

編譯器處理不同

巨集定義是乙個"編譯時"概念,在預處理階段展開,不能對巨集定義進行除錯,生命週期結束與編譯時期;

const常量是乙個"執行時"概念,在程式執行使用,類似於乙個唯讀行資料

儲存方式不同

巨集定義是直接替換,不會分配記憶體,儲存於程式的**段中;

const常量需要進行記憶體分配,儲存與程式的資料段中

定義域不同

void f1 ()

void f2 ()

是否可以做函式引數

巨集定義不能作為引數傳遞給函式

const常量可以在函式的引數列表中出現

const限定符定以後是不可以改變的,所以在定義時必須賦初始值,要不然是錯誤的,除非這個變數是用extern修飾的外部變數

const int a=10;       //正確。

const int a; //錯誤,沒有賦初始值。

extern const int a; //正確,使用extern的外部變數。

bjarne 在他的 the c++ programming language 裡面給出過乙個助記的方法:把乙個宣告從右向左讀

char  * const cp; ( * 讀成 pointer to ) 

cp is a const pointer to char

const char * p;

p is a pointer to const char;

char const * p;

因為 c++ 裡面沒有 const* 的運算子,所以 const 只能屬於前面的型別。

c++標準規定,const關鍵字放在型別或變數名之前等價的。

const int n=5;    //same as below

int const m=10;

const int *p; //same as below const (int) * p

int const *q; // (int) const *p

char ** p1;

// pointer to pointer to char

const char **p2;

// pointer to pointer to const char

char * const * p3;

// pointer to const pointer to char

const char * const * p4;

// pointer to const pointer to const char

char ** const p5;

// const pointer to pointer to char

const char ** const p6;

// const pointer to pointer to const char

char * const * const p7;

// const pointer to const pointer to char

const char * const * const p8;

// const pointer to const pointer to const char

C 變數和常量

變數和常量是用來在程式中表示資料的。常量是指取值在程式的執行過程中始終保持不變的量,又分為文字常量 literal constant 和常變數 也稱 符號常量 本節將分三小節來介紹。變數 在程式中是指可以改變值的量。變數名 用於標識變數的識別符號。而且變數必須用識別符號進行標識。變數的型別 變數有型...

變數 常量 C語言的常量和變數

常量與變數 1.常量是指值不會改變的量 1 常量不能寫在賦值語句的左邊。2 常量不能進行自加 自減運算。2.變數是指在程式執行過程中其值可以發生改變的量 1 變數需占用一定數量的記憶體空間,而常量不需要。2 區域性變數若沒有宣告為靜態變數,那麼其初值是隨機的。3 不同型別的變數可以放在一起參與運算,...

C 之變數和常量

c 中每個變數都有指定的型別,型別決定了變數儲存的大小和布局,該範圍內的值都可以儲存在記憶體中,運算子可應用於變數上。變數的名稱可以由字母 數字和下劃線字元組成。它必須以字母或下劃線開頭。大寫字母和小寫字母是不同的,因為 c 是大小寫敏感的。型別描述 bool 儲存值 true 或 false。ch...