三问: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 已定义。?

  1. 是否定义了(char *)NULL - (char *)NULL

  2. 是否定义了(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 不是这种情况,它是一个空指针,因此不指向任何数组或对象。