三问:NULL-NULL是否定义? (uintptr_t)NULL - (uintptr_t)NULL 是否定义?
Three questions: Is NULL - NULL defined? Is (uintptr_t)NULL - (uintptr_t)NULL defined?
1.Is NULL - NULL
已定义。?
是否定义了(char *)NULL - (char *)NULL
?
是否定义了(uintptr_t)NULL - (uintptr_t)NULL
?
我知道它适用于我使用的所有实现。但是从标准的角度来看它是什么样子的呢?我找不到明确的答案。
编辑:
从骗子那里我假设问题的答案是:是的。
第二个和第三个问题呢?
C 标准文档 NULL
被定义为宏 ,它扩展为 implementation-defined 空指针常量
根据实际定义,表达式 NULL - NULL
可能有或没有定义值。例如:
- 如果
NULL
定义为#define NULL 0
,那么NULL - NULL
实际上是一个int
类型的常量表达式,值为0
.
- 如果
NULL
定义为 #define NULL ((void *)0)
,则表达式 NULL
违反约束,因为没有在 void 指针上定义算术。
第二个问题:是(char*)NULL - (char*)NULL
还是(uintptr_t)NULL - (uintptr_t)NULL
定义的?。这些表达式不再是约束违规:
由于从 void *
到算术类型的转换是实现定义的,因此无法说明 (uintptr_t)NULL - (uintptr_t)NULL
的值。在大多数当前系统上它将是 0
,但 C 标准没有定义它。
转换为(char *)
是一个稍微不同的事情:2个指针的区别仅在它们指向同一个数组时定义,或者指向数组最后一个元素之后的位置,在本次讨论中,一个对象被认为是一个元素的数组。 (char *)NULL
不是这种情况,它是一个空指针,因此不指向任何数组或对象。
1.Is NULL - NULL
已定义。?
是否定义了
(char *)NULL - (char *)NULL
?是否定义了
(uintptr_t)NULL - (uintptr_t)NULL
?
我知道它适用于我使用的所有实现。但是从标准的角度来看它是什么样子的呢?我找不到明确的答案。
编辑: 从骗子那里我假设问题的答案是:是的。
第二个和第三个问题呢?
C 标准文档 NULL
被定义为宏 ,它扩展为 implementation-defined 空指针常量
根据实际定义,表达式 NULL - NULL
可能有或没有定义值。例如:
- 如果
NULL
定义为#define NULL 0
,那么NULL - NULL
实际上是一个int
类型的常量表达式,值为0
. - 如果
NULL
定义为#define NULL ((void *)0)
,则表达式NULL
违反约束,因为没有在 void 指针上定义算术。
第二个问题:是(char*)NULL - (char*)NULL
还是(uintptr_t)NULL - (uintptr_t)NULL
定义的?。这些表达式不再是约束违规:
由于从
void *
到算术类型的转换是实现定义的,因此无法说明(uintptr_t)NULL - (uintptr_t)NULL
的值。在大多数当前系统上它将是0
,但 C 标准没有定义它。转换为
(char *)
是一个稍微不同的事情:2个指针的区别仅在它们指向同一个数组时定义,或者指向数组最后一个元素之后的位置,在本次讨论中,一个对象被认为是一个元素的数组。(char *)NULL
不是这种情况,它是一个空指针,因此不指向任何数组或对象。