-
Is NULL - NULL
定义。?
-
Is (char *)NULL - (char *)NULL
定义。?
-
Is (uintptr_t)NULL - (uintptr_t)NULL
定义?
我知道它适用于我使用的所有实现。但从标准的角度来看,它是什么样子的呢?我找不到明确的答案。
编辑:
从骗子看来,我认为问题的一个答案是:是的。
那么第二个问题和第三个问题呢?
C 标准文档NULL
被定义为宏它扩展为实现定义的空指针常量
根据实际定义,表达式NULL - NULL
可能有或没有定义值。例如:
- if
NULL
定义为#define NULL 0
, then NULL - NULL
实际上是类型的常量表达式int
值为0
.
- if
NULL
定义为#define NULL ((void *)0)
, 表达方式NULL
是一个约束违规,因为算术没有在 void 指针上定义。
第二个问题:are (char*)NULL - (char*)NULL
or (uintptr_t)NULL - (uintptr_t)NULL
定义?。这些表达式不再违反约束:
-
由于转换自void *
对于算术类型是实现定义的,对于其值无话可说(uintptr_t)NULL - (uintptr_t)NULL
。这将是0
在大多数当前系统上,但 C 标准没有定义它。
-
转换为(char *)
情况略有不同:只有当两个指针指向同一个数组或指向数组最后一个元素之后的位置时,才定义两个指针的差异,在本次讨论中,对象被视为包含一个元素的数组。情况并非如此(char *)NULL
,它是一个空指针,因此不指向任何数组或对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)