为什么比较时可以将一个值与最后一个元素进行比较?

3

标准规定:

除非两个指针都指向同一数组对象的元素或超过该数组对象的最后一个元素,否则行为未定义。

为什么可以引用超出最后一个元素的位置?


3
因为标准规定它是有效的... - Edgar Rokjān
@EdgarRokyan;这就是他想知道原因的原因。 - haccks
您可能需要澄清的是,指向的唯一内容是指针的计算。在该位置没有实际对象可供引用,这是合法的。 - WhozCraig
1个回答

5

只计算指针并与其进行比较是可以的。原因是它可以用于使用一对指针传递和迭代数组。

如果标准不允许,仅存在pend就会导致以下循环表现出未定义的行为。

int arr[100] = {0};

for (int *pbegin = arr, *pend = arr + 100; pbegin != pend; ++pbegin)
{
  // do stuff
}

在C++中,特别是在标准库中,将范围作为“从开始到结束的迭代器”传递的习惯用法非常重要。


好的,这正如我预期的那样。但是,为什么... *pendAndOne = arr + 101; pbegin!=(pendAndOne-1); ...是未定义的呢? - wulfgarpro
1
@wulfgarpro - 因为这是标准委员会决定的。为了方便使用有用的习语而做出单一例外似乎对他们来说是合理的。将其他所有内容留作未定义行为允许不同的实现支持大不相同的环境。 - StoryTeller - Unslander Monica
如果允许 ... *pendAndOne = arr + 101;,那么 ... *pendAndOne = arr + 102; 呢?... - songyuanyao
@songyuanyao arr + 101 是未定义行为。 - 2501
3
在标准制定时,越过结尾指针是有用的,并且已经适用于所有现有的实现。当您超过一个单位时,那就不是很有用了,而且可能会破坏某些实现(尽管可能需要超过两个单位),或者表现出标准无法描述的方式(例如重新指向arr),因此没有必要对此进行标准化。 - user743382
@hvd,非常有用的信息,谢谢。 - wulfgarpro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接