注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。
測試環境:ubuntu 14.04
gcc版本:4.8.4
一、c語言的變數屬性
* c語言中的變數可以有自己的屬性
* 在定義變數的時候可以加上「屬性」關鍵字
* 「屬性」關鍵字指明變數的特有意義
語法:
property type var_name;
示例: int main()
二、auto關鍵字
* auto即c語言中區域性變數的預設屬性
* auto表明將被修飾的變數儲存於棧上
* 編譯器預設所有的區域性變數都是auto的
示例:
void f()
三、register關鍵字
* register關鍵字指明將區域性變數儲存於暫存器中
* register只是請求暫存器變數,但不一定請求成功
* register變數的必須是cpu暫存器可以接受的值
* 不能用&運算子獲取register變數的位址
#include register int g_v; //error,不是區域性變數
int main()
register為了最大限度提高**速率,被register修飾的變數不能用&運算子獲取位址。
四、static關鍵字
* static關鍵字指明變數的「靜態」屬性
- static修飾的區域性變數儲存在程式靜態區
* static關鍵字同時具有「作用域限定符」的意義
- static修飾的全域性變數作用域只是宣告的檔案中
- static修飾的函式作用域只是宣告的檔案中
#include int g_v; //全域性變數,程式的任意地方均能訪問
static int g_vs; //靜態全域性變數,只有當前檔案中可訪問
int main()
例項分析
auto,register,static對比分析
5-1.c
#include int f1()
int f2()
int main()
for(i=0; i<5; i++)
return 0;
}
操作:
5-1.c:27:2: error: address of register variable 『j』 requested
printf("%p\n", &j);
b.注釋掉main()函式中:
//printf("%p\n", &j); // error編譯通過,列印:
0x0027f934
0x0031815811
1111
2345
分析:
區域性變數出棧後會被銷毀,靜態變數宣告週期是整個程式執行週期。
五、extern關鍵字
* extern用於宣告「外部」定義的變數和函式
- extern變數在檔案的其它地方分配空間
- extern函式在檔案的其它地方定義
* extern用於「告訴」編譯器用c方式編譯
c++編譯器和一些變種c編譯器缺省會按「自己」的方式編譯函式和變數,通過extern關鍵字
可以命令編譯器「以標準c方式進行編譯」。
extern "c"
}
程式設計實驗
static和extern的使用
5-2.c
#include extern int geti();
int main()
g.cstatic int g_i;
int geti()
操作:
a. gcc 5-2.c g.c -o 5-2.out編譯正確,列印結果:
0
小結:
* auto變數儲存在程式的棧中,預設屬性
* static變數儲存在程式靜態區中,使用完畢後資料不銷毀
* register變數請求儲存於cpu暫存器中
* extern變數在檔案的其它地方分配空間
* extern能夠指示編譯器按照標準c方式編譯程式
C05 變數屬性
6.總結 語法 property type var name 示例 intmain void f include register int g val error int main include int g val 全域性變數,可以在程式的任意位置訪問 static int g sval 靜態全域...
spring 05 屬性注入
spring屬性注入 autowired resource autowired 自動裝配 根據類的型別進行自動裝配,無需在類中指定set方法。但出現的問題是如果含有多個同樣的型別,如果不知道名稱則會報錯。原因很簡單 程式分不清楚你要裝入的是哪個型別。指定裝入型別的方式 1 在類的宣告除指定名字 re...
條件變數屬性 時鐘屬性
條件變數有兩個屬性 程序共享屬性 時鐘屬性。1 程序共享屬性 條件變數與互斥量的共享屬性的用法一樣 int pthread condattr init pthread condattr t attr int pthread condattr destroy pthread condattr t at...