250*_*501 1 c standards language-lawyer
(我引用的是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上有很多答案说这不是真的.
给出引用的部分,我很难相信他们.
(请使用最新标准的参考答案)
标准是否定义空指针常量以将所有位设置为零?
不,它没有.C标准的任何段落都没有规定这样的要求.
void *p = 0;
Run Code Online (Sandbox Code Playgroud)
p
例如,是一个空指针,但标准不要求该对象p
必须设置所有位.
有关信息,c-faq网站提到了一些具有非零空指针表示的系统:http://c-faq.com/null/machexamp.html
不,NULL 不必全部为零。
N1570 6.3.2.3 指针第 3 段:
值为 0 的整数常量表达式,或转换为 void * 类型的此类表达式,称为空指针常量。66) 如果将空指针常量转换为指针类型,则结果指针(称为空指针)保证与指向任何对象或函数的指针不相等。
见我上面强调:整数0
的转换,如果有必要,它并不一定有相同的比特演示。
页面底部的注释 66 说:
66)宏NULL在(和其他头文件)中定义为空指针常量;见 7.19。
这将我们引向那一章的一段:
宏是
空值
它扩展为实现定义的空指针常量
更重要的是,在附件 J.3.12(可移植性问题、实现定义的行为、库函数)上说:
— 宏 NULL 扩展到的空指针常量 (7.19)。