2012-10-24 31 views
4

我從我的角度來看編譯器行爲很奇怪,它允許將布爾值賦值爲* char編譯器允許'char * k = false'?爲什麼?

char * k= false; 

爲什麼?但分配後* char仍未初始化。爲什麼編譯器不允許賦值int值?

+0

這使'k'成爲一個NULL指針,就像'char * k = 0'一樣。 –

+0

這是從'bool'到'char *'的隱式轉換。但是,這隻適用於轉換爲(int)0的常量表達式,這是一個指針的特殊初始值設定項。如果有人引用標準中的相應規則,會很有趣。 – peterchen

回答

5

它將隱含地將布爾值false轉換爲值爲零的整數,並如此聲明NULL指針。距離

char* k = 0; 

這是有效的語法

0

falsetrue01快捷有效的沒有什麼不同。對於你使用的指針NULL其中define NULL 0。所以它正確的語法。

0

編譯器允許它,因爲在C++中false0NULL相同。

就個人而言,至少對於作業而言,我發現使用NULL來表示空指針更容易理解和更正確。

順便說一句,在C++之前,在某些系統上NULL實際上是一個宏定義爲(void*)0xffff;一些背景可以在this answer找到。

+0

我需要驗證在標準中,但在C++中,NULL是0.看看B. Stroustrup頁面,我從C++的初始創建者本身得到確認:http://www.stroustrup.com/bs_faq2.html# null – paercebal

+0

@paercebal我正在瘋狂地尋找我想起它的地方,所以我在此期間重申了我的答案:) –

+0

FWIW,[Wikipedia says](http://en.wikipedia。org/wiki/Boolean_datatype)「C++具有單獨的布爾數據類型('bool'),但自動轉換標量和指針值,這些值與C」非常相似。目前沒有標準。 – jweyrich

2

C++ 03標準,#4.10:

空指針常數是整數表達式(5.19) 右值計算結果爲非零整數型的。

5.19:

的積分常數表達式可以只涉及文字(2.13), 統計員,常量變量或積分靜態數據成員或常量表達式(8.5)初始化 枚舉類型, 整型或枚舉類型的非類型模板參數,以及sizeof表達式。

false是一個布爾文字,因此它屬於常量表達式的類別,所以它可以限定爲空指針常量。

+0

而'布爾'是一個整數類型(3.9.1/7 )。 –

相關問題