命名空间
变体
操作

cast 运算符

来自 cppreference.cn
< c‎ | language

执行显式类型转换

目录

[编辑] 语法

( type-name ) expression

其中

type-name - 类型 void 或任何 标量类型
expression - 表达式,属于 标量类型 (除非 type-name 是 void,在这种情况下它可以是任何类型)

[编辑] 解释

如果 type-namevoid,则会求值 expression 以获取其副作用,并丢弃其返回值,就像 expression 本身被用作 表达式语句

否则,如果 type-name 正好是 expression 的类型,则不执行任何操作(除非 expression 具有浮点类型,并且以比其类型指示的更大的范围和精度表示——见下文)

否则,expression 的值将转换为 type-name 命名的类型,如下所示

允许每个 如同赋值的隐式转换

除了隐式转换外,还允许以下转换

  • 任何整数都可以强制转换为任何指针类型。除了空指针常量(例如 NULL,它不需要强制转换)外,结果是实现定义的,可能未正确对齐,可能未指向引用类型的对象,并且可能是陷阱表示
  • 任何指针类型都可以强制转换为任何整数类型。结果是实现定义的,即使对于空指针值也是如此(它们不一定导致值零)。如果结果无法在目标类型中表示,则行为是未定义的(无符号整数不对来自指针的强制转换实现模运算)
  • 任何指向对象的指针都可以强制转换为任何其他指向对象的指针。如果该值未针对目标类型正确对齐,则行为是未定义的。否则,如果该值转换回原始类型,则它与原始值相等。如果指向对象的指针被强制转换为指向任何字符类型的指针,则结果指向对象的最低字节,并且可以递增到目标类型的大小(换句话说,可以用于检查对象表示或通过 memcpymemmove 进行复制)。
  • 任何指向函数的指针都可以强制转换为指向任何其他函数类型的指针。如果将结果指针转换回原始类型,则它与原始值相等。如果转换后的指针用于进行函数调用,则行为是未定义的(除非函数类型兼容
  • 在指针之间进行强制转换时(无论是对象指针还是函数指针),如果原始值是其类型的空指针值,则结果是目标类型的正确空指针值。

在任何情况下(无论是执行隐式转换还是相同类型强制转换),如果 expressiontype-name 是浮点类型,并且 expression 以比其类型指示的更大的范围和精度表示(参见 FLT_EVAL_METHOD),则范围和精度将被剥离以匹配目标类型。

cast 表达式的值类别始终为非左值。

[编辑] 注解

由于 constvolatilerestrict_Atomic 限定符仅对左值有效,因此强制转换为 cvr 限定类型或原子类型与强制转换为相应的非限定类型完全等效。

强制转换为 void 有时对于消除关于未使用结果的编译器警告很有用。

此处未列出的转换是不允许的。特别是,

  • 指针类型和浮点类型之间没有转换
  • 指向函数的指针和指向对象的指针(包括 void*)之间没有转换

如果实现提供 intptr_t 和/或 uintptr_t,则从指向对象类型(包括 cv void)的指针到这些类型的强制转换始终是明确定义的。但是,这不能保证用于函数指针。

(自 C99 起)

请注意,函数指针和对象指针之间的转换被许多编译器接受为扩展,并且 POSIX dlsym() 函数的某些用法也期望这种转换。

[编辑] 示例

#include <stdio.h>
 
int main(void)
{
    // examining object representation is a legitimate use of cast
    double d = 3.14;
    printf("The double %.2f (%a) is: ", d, d);
    for (size_t n = 0; n < sizeof d; ++n)
        printf("0x%02x ", ((unsigned char*)&d)[n]);
 
    // edge cases
    struct S { int x; } s;
//    (struct S)s; // error; not a scalar type
                   // even though casting to the same type does nothing
    (void)s; // okay to cast any type to void
}

可能的输出

The double 3.14 (0x1.91eb851eb851fp+1) is: 0x1f 0x85 0xeb 0x51 0xb8 0x1e 0x09 0x40

[编辑] 参考

  • C23 标准 (ISO/IEC 9899:2024)
  • 6.5.4 Cast operators (p: TBD)
  • C17 标准 (ISO/IEC 9899:2018)
  • 6.5.4 Cast operators (p: 65-66)
  • C11 标准 (ISO/IEC 9899:2011)
  • 6.5.4 Cast operators (p: 91)
  • C99 标准 (ISO/IEC 9899:1999)
  • 6.5.4 Cast operators (p: 81)
  • C89/C90 标准 (ISO/IEC 9899:1990)
  • 3.3.4 Cast operators

[编辑] 参见

C++ 文档 关于 显式类型转换