空指针允许加零吗?MyArray类end()实现及指针运算合法性咨询
问题解答
一、原始end()实现是否合法可行?
答案是合法且可行,完全不需要额外加(arraySize == 0) ? nullptr : ...的条件判断。
根据C标准(C11及后续版本)的[expr.add]章节规则:
若指针
p是空指针,则表达式p + 0和0 + p的行为是定义良好的,结果等于p本身。
当数组为空时,arrayBegin是nullptr且arraySize为0,此时arrayBegin + arraySize等价于nullptr + 0,完全符合标准要求,结果就是nullptr,和条件判断版本的返回值完全一致。
二、nullptr - nullptr是否被允许?
答案是不允许,属于未定义行为。
C++标准[expr.add]章节对指针减法的规则明确:
只有当两个指针指向同一个数组对象的元素,或者其中一个指向该数组末尾之后的位置时,指针减法的结果才是定义良好的。
两个nullptr并不指向任何实际存在的数组对象,也不属于“数组末尾之后的位置”(这个位置仅针对真实存在的数组而言),因此nullptr - nullptr的行为是标准未定义的——虽然部分编译器可能会返回0,但这不是标准强制要求的,在不同编译环境或优化等级下可能出现意外结果,绝对不能依赖这个操作。
内容的提问来源于stack exchange,提问作者Jarek C
相关产品推荐
相关产品推荐

