为什么我可以在C中隐式地将int字面量转换为int *,但在c++中却不能
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++中唯一可以转换为指针类型的整型值是空指针常量,尽管从技术上讲,转换为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中不是无效的。
- 是否可以从int转换为enum类类型
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 将字符串中的 int 转换为字母;
- 主.cpp:18:20:错误:从"int*"转换为"int"会失去精度 [-fa
- 将非常大的 int 转换为双倍,在某些计算机上会损失精度
- 如何将矢量<int>转换为字符数组?
- C++ 无法从 const int* 转换为 const_iterator
- 我不断收到错误 C2440'=':无法从"int *(__cdecl *)(int *,int *,int,int)"转换为"int *
- 如何将 int[4] 转换为 std::array<int,4>?
- 如何将data[i].int转换为vaible
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- 将私有矩阵形式 int 转换为双 C++
- 无法将参数 1 从 'int' 转换为 'int &'
- 将 int 转换为字符串后始终得到 0
- isspace 函数的性能警告,从 int 转换为布尔值
- 将大 int 转换为浮点数,而不舍入 c++
- 错误:无法将'uint8* {aka unsigned int*}'转换为"常量emxArray_uint8_T*"?
- 将未签名的INT转换为BCD
- 在 C++ 中将 int 转换为双精度