博华康生php-c说明书,cast operator

本文详细介绍了C语言中的类型转换规则,包括整型到指针型、指针型到整型、不同指针之间的转换以及浮点数类型的转换。强调了转换中的注意事项,如空指针转换、未对齐的指针转换以及不兼容的函数指针调用可能导致的未定义行为。此外,还提到了类型转换在消除未使用结果警告中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

执行明确的类型转换。

句法

( type-name ) expression

其中

类型名-无论是 void 类型还是任何标量类型表达-标量类型的任何表达式(除非类型名称是无效的,在这种情况下,它可以是任何东西)

说明

如果 type-name 是void,那么表达式会计算其副作用,并将其返回值作为表达式语句放弃,与将表达式单独使用时相同。

否则,如果 type-name 恰好是表达式的类型,则不做任何事情(除非表达式具有浮动类型,并且表示的范围和精度比其类型指示的大 - 参见下文)。

否则,表达式的值将转换为由 type-name 命名的类型,如下所示:

每个隐式转换就像是通过赋值一样是允许的。

除了隐式转换之外,还允许进行以下转换:

任何整数都可以转换为任何指针类型。除了空指针常量NULL(不需要强制转换)之外,结果是实现定义的,可能未正确对齐,可能不指向引用类型的对象,并且可能是陷阱表示。

任何指针类型都可以转换为任何整数类型。结果是实现定义的,即使对于空指针值(它们不一定会导致值为零)。如果结果不能在目标类型中表示,则行为是未定义的(无符号整数不能对来自指针的强制执行模运算)

任何指向对象的指针都可以转换为任何其他指向对象的指针。如果该值未针对目标类型正确对齐,则行为未定义。否则,如果该值被转换回原始类型,则它与原始值相等。如果指向对象的指针转换为指向任何字符类型的指针,则结果指向该对象的最低字节,并且可以递增至目标类型的大小(换言之,可用于检查对象表示或制作memcpy或通过复制memmove)。

任何指向函数的指针都可以转换为指向任何其他函数类型的指针。如果生成的指针转换回原始类型,则它与原始值相等。如果转换的指针用于进行函数调用,则行为是未定义的(除非函数类型兼容)

在指针(对象或函数)之间进行转换时,如果原始值是其类型的空指针值,则结果是目标类型的正确空指针值。

无论如何(在执行隐式转换时以及在同一类型转换中),如果 expression 和 type-name 是浮点类型,并且表达式的范围和精度比其类型所指示FLT_EVAL_METHOD的范围和精度要高(参见范围和精度被删除)关闭以匹配目标类型。

转换表达式的值类别始终是非左值。

笔记

因为const,volatile,restrict 和 atomic 限定符只对左值有影响,所以对 cvr 限定或原子类型的转换完全等同于转换为相应的非限定类型。

无效的转换有时可以用来消除关于未使用结果的编译器警告。

未列在这里的转换不被允许。尤其是,

指针和浮点类型之间没有转换

在指向函数的指针和指向对象的指针之间没有转换(包括void*)

在指向函数和整数的指针之间没有转换

#include 

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 

// 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):6.5.4 Cast operators (p: 91)

C99 standard (ISO/IEC 9899:1999):6.5.4 Cast operators (p: 81)

C89/C90 standard (ISO/IEC 9899:1990):3.3.4 Cast operators

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值