【发布时间】:2020-05-11 16:45:02
【问题描述】:
标准说:
“值为 0 的整型常量表达式,或这种类型转换为
void*的表达式,称为 空指针常量。67) 如果为空指针常量转换为指针类型,生成的指针,称为 空指针,保证与指向任何对象或函数的指针不相等。"
"67) 宏 NULL 在 stddef.h(和其他头文件)中定义为空指针常量;参见 7.19。"
来源:ISO/IEC 9899:2018 (C18),§6.2.3.2/3“指针”。
最常见的空指针常量当然是0和(void*) 0被大多数实现用作空指针常量,但作为标准要求 - "值为 0 的整型常量表达式,或转换为 void* 类型的表达式 - 空指针常量 也应该是任何以下内容:
1 * 00 * 00 - 025 - 25(-4) + (4)(0 * ((0 * 25) * 3)(0) * (-100)
就像他们的任何以(void*) 开头的吊坠一样,f.e. (void*) (1 * 0) 或 (void*) (25 - 25)。
以及布尔表达式:
(void*) ((1 + 1) == 25)(void*) !(9)
因此,任何类似以下之一的陈述:
int* ptr = 25 - 25;int* ptr = (void*) ((-4) + 4);int* ptr = (0 * ((0 * 25) * 3);int* ptr = (void*) !(9);int* ptr = ((1 + 1) == 25);
应根据标准将ptr 设为空指针。
- 我的担忧是对的还是有什么问题?
我正在寻找 C 标准中任何使本文无效的部分。
据我搜索,Stack Overflow 上不应该有此问题的重复项。
【问题讨论】:
-
我不确定
25 - 25是常量的标准保证。 -
@EugeneSh。不是整数常量表达式吗?
-
我不明白为什么这些不起作用。请注意,您的问题 title(“Can ... 任何计算为 0 的表达式”)是不同的,并且 not 为真。例如,
(void*) strlen("")不能保证为空指针。 -
port70.net/~nsz/c/c11/n1570.html#6.6 - 似乎列出了必要条件,但不是充分条件。所以我不确定一个表达式可以保证是不变的。
标签: c pointers null language-lawyer constant-expression