剛開始K & R
並在第二章,有一行:定義和變量聲明與價值
聲明列出的變量是 使用和狀態,他們有什麼類型和 也許他們的初始值是什麼。
所以:
int x = 42
是定義。
和int x
是聲明也是一個定義因爲每個定義是聲明。
但是,當我們分配初值像K & R
說,不說讓聲明一個定義?
剛開始K & R
並在第二章,有一行:定義和變量聲明與價值
聲明列出的變量是 使用和狀態,他們有什麼類型和 也許他們的初始值是什麼。
所以:
int x = 42
是定義。
和int x
是聲明也是一個定義因爲每個定義是聲明。
但是,當我們分配初值像K & R
說,不說讓聲明一個定義?
你混淆了兩兩件事:
* object as in:變量,函數等,而不是OOP對象。
因此,定義通常也是一個聲明,因爲當您不聲明對象的類型時,您無法定義對象中的內容。最容易記住的只是:「每一個定義是一個聲明,但不是每一個聲明是一個定義」
對於變量
有隻1沒有定義的變量聲明方式:
extern typeX variable_name
這告訴編譯器有一個名爲variable_name的變量,其類型爲typeX,但沒有獲取它的位置。 聲明一個變量的其他方法也是一個定義,因爲它告訴編譯器爲它保留空間並可能給它一個初始值。
所不同的是在結構和功能更加清晰:
對於結構
的聲明:
struct some_struct{
int a;
int b;
}
這聲明some_struct到編譯器與A和B作爲結構體變量都類型爲int。
只有當你定義它們保留空間,你可以使用它們:
void foo(){
struct some_struct s;
s.a = 1; // For this to work s needs to be defined
}
對於功能:
不同的是更加清晰
聲明:
// This tells the compiler that there is a function called "foo" that returns void and takes void arguments
void foo();
定義可能是像上面那個(在結構部分)
基本上,你可以說一個聲明只是告訴編譯器,在那裏有一個具有該名稱和類型的變量。它確實會產生任何代碼,而在C中,這必須通過變量上的extern
關鍵字完成。函數原型(沒有實現)也僅僅是聲明,並不需要extern
關鍵字,但仍然可以提供它。定義產生代碼,例如爲堆棧分配內存或爲變量分配內存,或爲方法分配內存。
從這個意義上講,你的兩個表述都是定義,任何定義也是一個解釋。
我認爲用K & R A錯誤可能......
這是如何回答我的問題? – user225312 2011-02-25 16:10:11
事實上,你不能給變量聲明分配一個默認值,除非它也是一個定義。但正如我所說:有時這些術語被用作同義詞。 除非這是關於結構的一部分:當聲明所述結構時,可以將默認值賦給結構的變量。 – dtech 2011-02-25 16:59:13