簡體   English   中英

為什么我可以隱式地將int文字轉換為C中的int *而不是C ++中的int *?

[英]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 ++中,沒有從intint*執行隱式轉換,因此需要顯式轉換。

一直以來,C都有隱含的轉換 - 根據我的經驗,幾乎從任何整數類型到任何其他整數類型。 C中的指針被 認為是整數 scalar類型。

在C ++中,積分類型定義如下:

類型boolcharchar16_tchar32_twchar_t以及有signedunsigned整數類型統稱為整數類型。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM