【发布时间】:2015-02-27 03:28:51
【问题描述】:
(我引用的是 ISO/IEC 9899:201x)
这里我们看到,整数常量表达式有一个整数类型:
6.6 常量表达式
6。 整数常量表达式应该是整数类型并且应该只有操作数 即整数常量、枚举常量、字符常量、sizeof 结果是整数常量、_Alignof 表达式和浮点数的表达式 作为强制转换的直接操作数的常量。在整数常量中转换运算符 表达式只能将算术类型转换为整数类型,除非作为 sizeof 或 _Alignof 运算符的操作数。
那么这适用于任何整数类型:
6.2.6.2 整数类型
5。 未指定任何填充位的值。有效(非陷阱)对象表示 符号位为零的有符号整数类型是 对应的无符号类型,并且应该代表相同的值。 对于任何整数类型, 所有位为零的对象表示应是值的表示 该类型为零。
然后我们看到空指针常量是使用值为0的整数常量表达式定义的。
6.3.2.3 指针
3。 值为 0 的整数常量表达式,或这种类型的表达式 void*, 称为空指针常量。 如果将空指针常量转换为 指针类型,结果指针,称为空指针,保证比较不相等 指向任何对象或函数的指针。
因此,空指针常量必须将其所有位设置为零。
但是网上和 StackOverflow 上有很多答案说这不是真的。
鉴于引用的部分,我很难相信他们。
(请参考最新标准回答)
【问题讨论】:
-
首先,6.2.6.2/5 说“所有位为零”结果为 0,而不是 0 必须是所有位为零。此外,将整数转换为指针的结果是实现定义的(6.3.2.3/5),因此将 0 转换为
void *类型的结果不一定都是零位。 -
@T.C.这听起来很矛盾。如果所有位为零表示值
0,则值0必须所有位为零。 -
@2501 不,因为值和位模式之间不一定存在一对一的相关性。
-
@2501:您可以将 24 位 int 存储在 32 位中,并忽略 8 个填充位。包括填充位零在内的所有位都是 0。但 0 可能有一些未设置的填充位。
-
@2501:必须有一个所有位为零的值为零,但不能保证只有一个零——可能还有其他位模式也为零,并使用 @ 987654324@ 文字可能会为您提供其他模式之一,而不是全 0 位模式。真正的问题是全零位表示是否是空指针,标准并没有真正解决这个问题。
标签: c standards language-lawyer