为什么我可以在C中隐式地将int字面量转换为int *,但在c++中却不能

Why can I implicitly convert an int literal to an int * in C but not in C++?

本文关键字:int 转换 但在 不能 c++ 我可以 为什么      更新时间:2023-10-16

我认为在下面的代码中,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_tsignedunsigned的整型合称称为整型。48整型的同义词是整型。整型的表示应使用纯二进制记数系统来定义值。49[示例:本国际标准对于整型,允许2的补码,1的补码和带符号的幅度表示。端例]

c++中唯一可以转换为指针类型的整型值是空指针常量,尽管从技术上讲,转换为std::nullptr_t类型的prvalue。(para 4.10)

而不是像这样修复:

int *ptoi = (int *)17;

考虑添加c++风格强制转换:

int *ptoi = reinterpret_cast<int*>(17);

来明确你要调用的是哪种转换

编译器将int *ptoi = 17;解释为指向位置为17 (0x00000011)的整数的变量pti。

C是一种完全不同的语言。它可能看起来像c++,但它不是。不同的规则适用于两种语言。

我应该指出C和c++都将(据我所知)使其成为指向0x00000011的指针,但C只是抱怨较少,因为分配内存位置在C中不是无效的。