1. 程式人生 > >宣告、定義、賦值的區別

宣告、定義、賦值的區別

如果是指變數的宣告和定義:


從編譯原理上來說,宣告是僅僅告訴編譯器,有個某型別的變數會被使用,但是編譯器並不會為它分配任何記憶體。

而定義就是分配了記憶體。

對於下面的兩句程式碼:
void Func()
{
int a;
int b=1;
a=0;
}

對於第一行程式碼,編譯器不會做任何事,它不會為它在棧中分配一點東西,直到第三句,a=0;時,編譯器才會將其壓入棧中。

而對於int b=0;這一句,編譯器就會生成一條指令,為它賦值。如果反彙編,看到的程式碼可能是這樣的:

push 1;        
push 0;
當然,並不一定編譯器就會樣做,也有可能在宣告int a時,編譯器就會把一個廢值入棧,到第三條再為其賦值,這要看編譯器的具體取捨,所以,宣告不一定不是定義,而定義一定是定義。
但是,下面的宣告,一定僅僅是宣告:
extern int a;
這表時,有一個int變數a,它一定是在另外其他地方定義的,所以編譯器此時一定不會做什麼分配記憶體的事,因為它就是宣告,僅僅表明下面的程式碼引用了一個符號,而這個符號是int型別的a而已。 






如果是指函式的宣告和定義:


宣告:一般在標頭檔案裡,對編譯器說:這裡我有一個函式叫function() 讓編譯器知道這個函式的存在。


定義:一般在原始檔裡,具體就是函式的實現過程 寫明函式體。