[英]Why can I implicitly convert an int literal to an int * in C but not in C++?
我相信在下面的代碼中,C“自動將17轉換為int *
”,正如有人最近指出的那樣(但沒有說明原因),這是錯誤的。
int *ptoi = 17; // I assumed that 17 is being automatically casted to int *
我知道如果我在C ++中執行與上面相同的操作,我會收到一條錯誤,指出invalid conversion from int to int *
。 但是,如果我在C ++中執行以下操作,它可以正常工作:
int *ptoi = (int *)17;
這些是我認為在C中,鑄造是隱含的原因。
有人可以解釋為什么,在C ++中,我必須使用它,但在C中,它工作正常嗎?
從整數到沒有強制轉換的指針的轉換在C中也是非法的。大多數編譯器會讓你逃脫它。 Clang發出警告:
example.c:5:8: warning: incompatible integer to pointer conversion initializing
'int *' with an expression of type 'int'
int *x = 17;
^ ~~
C99在第6.5.4節演員操作員第4段中說:
除了6.5.16.1的約束允許之外,涉及指針的轉換應通過顯式轉換來指定。
6.5.16.1是void *
轉換為其他指針而不需要強制轉換的例外。
C ++規范在第5.4節顯式類型轉換(強制轉換表示法)第3段中說明:
下面未提及且未由用戶明確定義的任何類型轉換都是錯誤的。
所以你去 - 兩種語言都是非法的,但為了與許多舊軟件兼容,很多C編譯器都會讓你逃脫它。
是的,雖然許多(所有?)編譯器發出警告,但是C中隱含了轉換。 在C ++中,沒有從int
到int*
執行隱式轉換,因此需要顯式轉換。
一直以來,C都有隱含的轉換 - 根據我的經驗,幾乎從任何整數類型到任何其他整數類型。 C中的指針被
認為是整數
scalar
類型。
在C ++中,積分類型定義如下:
類型
bool
,char
,char16_t
,char32_t
,wchar_t
以及有signed
和unsigned
整數類型統稱為整數類型。 48整數類型的同義詞是整數類型。 整數類型的表示應使用純二進制計算系統定義值。 49 [例子:本國際標准允許積分類型的2的補碼,1的補碼和帶符號的幅度表示。 - 末端的例子]
可以在C ++轉換為指針類型的唯一積分值是空指針常數 ,雖然在技術上轉換是到prvalue
類型std::nullptr_t
。 (第4.10段)
最后的說明
而不是像這樣修復它:
int *ptoi = (int *)17;
考慮添加C ++風格的強制轉換:
int *ptoi = reinterpret_cast<int*>(17);
清楚地說明您要調用的轉換類型
編譯器將解釋int *ptoi = 17;
作為變量ptoi,指向位置17處的整數(0x00000011)。
C只是一種完全不同的語言。 它可能看起來像C ++,但事實並非如此。 不同的規則適用於這兩種語言。
我應該指出,C和C ++都會(據我所知)使它成為指向0x00000011的指針,但C只是抱怨較少,因為在C中分配內存位置是無效的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.