cast operator
cast 操作员
执行明确的类型转换。
句法
( type-name ) expression | | |
---|
其中
类型名 | - | 无论是 void 类型还是任何标量类型 |
---|---|---|
表达 | - | 标量类型的任何表达式(除非类型名称是无效的,在这种情况下,它可以是任何东西) |
说明
如果 type-name 是void
,那么表达式会计算其副作用,并将其返回值作为表达式语句放弃,与将表达式单独使用时相同。
否则,如果 type-name 恰好是表达式的类型,则不做任何事情(除非表达式具有浮动类型,并且表示的范围和精度比其类型指示的大 - 参见下文)。
否则,表达式的值将转换为由 type-name 命名的类型,如下所示:
每个隐式转换就像是通过赋值一样是允许的。
除了隐式转换之外,还允许进行以下转换:
- 任何整数都可以转换为任何指针类型。除了空指针常量
NULL
(不需要强制转换)之外,结果是实现定义的,可能未正确对齐,可能不指向引用类型的对象,并且可能是陷阱表示。
无论如何(在执行隐式转换时以及在同一类型转换中),如果 expression 和 type-name 是浮点类型,并且表达式的范围和精度比其类型所指示FLT_EVAL_METHOD
的范围和精度要高(参见范围和精度被删除)关闭以匹配目标类型。
转换表达式的值类别始终是非左值。
笔记
因为const,volatile,restrict 和 atomic 限定符只对左值有影响,所以对 cvr 限定或原子类型的转换完全等同于转换为相应的非限定类型。
无效的转换有时可以用来消除关于未使用结果的编译器警告。
未列在这里的转换不被允许。尤其是,
- 指针和浮点类型之间没有转换
例
#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
参考
- C11 standard (ISO/IEC 9899:2011):