C演员到底做了什么?

时间:2012-12-06 14:50:16

标签: c types casting

我编写了越来越多的C应用程序,现在我想知道关于强制转换的东西。在C ++中,动态转换是一种非常昂贵的操作(例如向下转换),但我甚至不知道静态转换。

在C中,我不得不写这样的东西:

assert ( p ); /* p is void* */
int v = *(int*)p;

这是一个“C动态演员”吗?它与C ++的static_cast<int*>(p)完全相同吗?它需要多少钱?

提前致谢。

4 个答案:

答案 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_caststatic_cast。{/ p>

我不认为C具有等效的dynamic_cast(“在此处插入运行时类型检查”)或static_cast(“执行额外的编译时类型检查”)。

请注意,对于非指针,事情会略有不同。

int b = 1;
double a = (double) b;

不是一个演员,而是一个显式的转换