P__*_*J__ 3 c pointer-arithmetic null-pointer language-lawyer
被NULL - NULL定义为。?
被(char *)NULL - (char *)NULL定义为。?
被(uintptr_t)NULL - (uintptr_t)NULL定义为?
我知道它适用于我使用的所有实现。但从标准的角度来看,它是什么样子的呢?我找不到明确的答案。
编辑:从骗子看来,我认为问题的一个答案是:是的。
那么第二个问题和第三个问题呢?
C 标准文档NULL将其定义为宏,该宏扩展为实现定义的空指针常量
根据实际定义,表达式NULL - NULL可能有定义值,也可能没有。例如:
NULL定义为#define NULL 0, then实际上是一个值为 的NULL - NULL类型的常量表达式。int0NULL定义为#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 *)稍微不同的事情:只有当两个指针指向同一个数组或数组最后一个元素之后的位置时,才定义两个指针的差异,在本次讨论中,一个对象被视为一个元素的数组。中的情况并非如此(char *)NULL,它是一个空指针,因此不指向任何数组或对象。
| 归档时间: |
|
| 查看次数: |
273 次 |
| 最近记录: |