我從我的角度來看編譯器行爲很奇怪,它允許將布爾值賦值爲* char
。編譯器允許'char * k = false'?爲什麼?
char * k= false;
爲什麼?但分配後* char仍未初始化。爲什麼編譯器不允許賦值int
值?
我從我的角度來看編譯器行爲很奇怪,它允許將布爾值賦值爲* char
。編譯器允許'char * k = false'?爲什麼?
char * k= false;
爲什麼?但分配後* char仍未初始化。爲什麼編譯器不允許賦值int
值?
它將隱含地將布爾值false
轉換爲值爲零的整數,並如此聲明NULL指針。距離
char* k = 0;
這是有效的語法
false
和true
是0
和1
快捷有效的沒有什麼不同。對於你使用的指針NULL
其中define NULL 0
。所以它正確的語法。
編譯器允許它,因爲在C++中false
與0
和NULL
相同。
就個人而言,至少對於作業而言,我發現使用NULL
來表示空指針更容易理解和更正確。
順便說一句,在C++之前,在某些系統上NULL
實際上是一個宏定義爲(void*)0xffff
;一些背景可以在this answer找到。
我需要驗證在標準中,但在C++中,NULL是0.看看B. Stroustrup頁面,我從C++的初始創建者本身得到確認:http://www.stroustrup.com/bs_faq2.html# null – paercebal
@paercebal我正在瘋狂地尋找我想起它的地方,所以我在此期間重申了我的答案:) –
FWIW,[Wikipedia says](http://en.wikipedia。org/wiki/Boolean_datatype)「C++具有單獨的布爾數據類型('bool'),但自動轉換標量和指針值,這些值與C」非常相似。目前沒有標準。 – jweyrich
C++ 03標準,#4.10:
空指針常數是整數表達式(5.19) 右值計算結果爲非零整數型的。
5.19:
的積分常數表達式可以只涉及文字(2.13), 統計員,常量變量或積分靜態數據成員或常量表達式(8.5)初始化 枚舉類型, 整型或枚舉類型的非類型模板參數,以及sizeof表達式。
false
是一個布爾文字,因此它屬於常量表達式的類別,所以它可以限定爲空指針常量。
而'布爾'是一個整數類型(3.9.1/7 )。 –
這使'k'成爲一個NULL指針,就像'char * k = 0'一樣。 –
這是從'bool'到'char *'的隱式轉換。但是,這隻適用於轉換爲(int)0的常量表達式,這是一個指針的特殊初始值設定項。如果有人引用標準中的相應規則,會很有趣。 – peterchen