我编写了越来越多的C应用程序,现在我想知道关于强制转换的东西。在C ++中,动态转换是一种非常昂贵的操作(例如向下转换),但我甚至不知道静态转换。
在C中,我不得不写这样的东西:
assert ( p ); /* p is void* */
int v = *(int*)p;
这是一个“C动态演员”吗?它与C ++的static_cast<int*>(p)
完全相同吗?它需要多少钱?
提前致谢。
答案 0 :(得分:8)
指针的C类型更像是C ++ reinterpret_cast
。它指示编译器将变量视为不同类型,并且在运行时不需要任何费用。
答案 1 :(得分:8)
C中的强制转换仅在编译时有意义,因为它告诉编译器如何操作一段数据。它不会更改数据的实际值。例如,(int*)p
告诉编译器将p
视为整数的内存地址。然而,这在运行时没有任何成本,处理器只是处理它们的原始数字。
答案 2 :(得分:6)
C cast更像是所有C ++样式的演员,除了 dynamic_cast
。因此,当您将int转换为另一个整数类型时,它是static_cast
。当您将指针转换为其他指针类型或整数类型或反之时,它是reinterpret_cast
。如果您丢弃const
,则为const_cast
。
C没有与dynamic_cast
类似的东西,因为它具有对象类型的概念,对C ++也没有用(没有虚函数......)。关于解释对象位的类型在与C中引用对象的表达式组合时变得很重要。对象本身没有类型。
答案 3 :(得分:2)
指针是指针 - 投射指针是一个noop。
以前是一个内存地址,之后是一个内存地址。
它本质上是一个声明“让我们假设这是一个指向x类型的指针,用于将来的类型检查”。
因此,您可以根据C ++将其称为reinterpret_cast
,因为它不执行额外的编译时类型检查,例如dynamic_cast
或static_cast
。{/ p>
我不认为C具有等效的dynamic_cast
(“在此处插入运行时类型检查”)或static_cast
(“执行额外的编译时类型检查”)。
请注意,对于非指针,事情会略有不同。
int b = 1;
double a = (double) b;
不是一个演员,而是一个显式的转换。