类型转换运算符
来自 cppreference.cn
执行显式类型转换
目录 |
[编辑] 语法
( 类型名 ) 表达式 |
|||||||||
其中
类型名称 | - | 类型 void 或任何标量类型 |
表达式 | - | 任何标量类型的表达式(除非类型名是 void,在这种情况下可以是任何类型) |
[编辑] 解释
如果类型名是void,则评估表达式的副作用,并丢弃其返回值,这与表达式作为表达式语句单独使用时相同。
否则,如果类型名与表达式的类型完全相同,则不执行任何操作(除了如果表达式具有浮点类型并且以比其类型指示的更大范围和精度表示——见下文)
否则,表达式的值将转换为类型名指定的类型,如下所示
允许所有隐式转换,如同通过赋值一样。
除了隐式转换,还允许以下转换
- 任何整数都可以转换为任何指针类型。除了空指针常量,如NULL(不需要转换),结果是实现定义的,可能未正确对齐,可能不指向引用类型的对象,并且可能是陷阱表示。
- 任何指针类型都可以转换为任何整数类型。结果是实现定义的,即使对于空指针值(它们不一定产生零值)。如果结果不能在目标类型中表示,则行为是未定义的(无符号整数在从指针转换时不实现模运算)
- 任何对象指针都可以转换为任何其他对象指针。如果值未针对目标类型正确对齐,则行为是未定义的。否则,如果值转换回原始类型,则与原始值相等。如果对象指针转换为任何字符类型的指针,则结果指向对象的最低字节,并且可以递增到目标类型的大小(换句话说,可以用于检查对象表示或通过memcpy或memmove进行复制)。
- 任何函数指针都可以转换为指向任何其他函数类型的指针。如果结果指针转换回原始类型,则与原始值相等。如果使用转换后的指针进行函数调用,则行为是未定义的(除非函数类型是兼容的)
- 在指针之间进行转换时(无论是对象还是函数),如果原始值是其类型的空指针值,则结果是目标类型的正确空指针值。
在任何情况下(无论是执行隐式转换还是同类型转换),如果表达式和类型名都是浮点类型,并且表达式以比其类型指示的更大范围和精度表示(参见FLT_EVAL_METHOD),则剥离范围和精度以匹配目标类型。
类型转换表达式的值类别始终是非左值。
[编辑] 注意
由于const
、volatile
、restrict
和_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 类型转换运算符 (p: TBD)
- C17 标准 (ISO/IEC 9899:2018)
- 6.5.4 类型转换运算符 (p: 65-66)
- C11 标准 (ISO/IEC 9899:2011)
- 6.5.4 类型转换运算符 (p: 91)
- C99 标准 (ISO/IEC 9899:1999)
- 6.5.4 类型转换运算符 (p: 81)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 3.3.4 类型转换运算符
[编辑] 另请参阅
C++ 文档关于显式类型转换
|