什么是一半的开放范围和末端值

What is half open range and off the end value

本文关键字:范围 一半 什么      更新时间:2023-10-16

这些术语在C 中是什么意思?

1. off end value

2.半开放范围-[begin, off_the_end)

我在阅读循环时遇到了它们。

半开范围是一个包括第一个元素,但不包括最后一个元素。

范围[1,5)是半开的,由值1、2、3和4组成。

"结束"或"过去"仅指序列结束后的元素,并且很特别,因为允许迭代器指向它(但您可能不会查看实际值,因为它不存在)

例如,在以下代码中:

char arr[] = {'a', 'b', 'c', 'd'};
char* first = arr
char* last = arr + 4;

first现在指向数组的第一个元素,而last超过数组的末端。我们被允许 point 超过数组末端(但不是过去),但是我们不允许尝试在该位置访问该元素:

// legal, because first points to a member of the array
char firstChar = *first;
// illegal because last points *past* the end of the array
char lastChar = *last;

我们的两个指针firstlast一起定义了它们之间的所有元素的范围。

如果是一个半开放范围,则包含first指向的元素,以及之间的所有元素,但不是last指向的元素(这是很好的,因为它实际上并没有指向一个有效元素)

在C 中,所有标准库算法都在这样的半开放范围上运行。例如,如果我想将整个数组复制到其他位置dest,我会这样做:

std::copy(first, last, dest)

一个简单的陆面通常遵循类似的模式:

for (int i = 0; i < 4; ++i) {
    // do something with arr[i]
}

此循环从0到4,但排除最终值,因此所涵盖的索引范围是 half half-open ,特别是 [0, 4)

这些不是C 特定术语,它们是一般数学术语。

[]和()表示范围是否包含/不包括端点:

  • [包括端点
  • (不包括端点
  • [] ='关闭',包括两个端点
  • ()='open',不包括两个端点
  • [)和(]均为"半开",仅包括一个端点

大多数C for-loops覆盖了半开的范围(您包括第一个元素:例如for int i=0;,但排除最终元素:i < foo,而不是i ≤ foo

,如其他答案所述,半开范围也是该术语在编程上下文中的数学术语和用法暗示起点是包括,终点为排除

在C/C 中编程的背景下,这实际上是什么意思?假设您将打印整数数组的元素。对于C语言说话,因为您对数组的大小没有任何运行时间知识,所以您有两个选择。您要么必须提供数组的大小,因此,功能签名将如下;

void printArray(int * array, int size);

或您必须使用半开范围,这意味着,您必须同时提供开始和结束指针(并且功能将在包括开始,不包括末端)附加阵列本身。函数签名将如下;

void printArray(int * array, int * begin, int * end);

要说明,这是提供数组大小的示例;

#include <stdio.h>
void printArray(int * array, int size)
{
    printf("Array: ");
    for(int i = 0; i < size; i++)
        printf("%2d ", array[i]);
    printf("n");
}
int main()
{
    int array[5] = { 1, 2, 3, 4, 5 };
    printArray(array, 5);
    return 0;
}

在上面的示例中,我们已经将两个参数传递给了printArray函数,因为它在功能签名中很明显,指向数组(或数组本身)的第一个元素的指针以及数组的大小。/p>

但是,正如我上面写的那样,我们还可以使用函数签名中的半开范围,如下所示;

#include <stdio.h>
void printArray(int * array, int * begin, int * end)
{
    printf("Array: ");
    for(int * index = begin; index != end; index++)
        printf("%2d ", *index);
    printf("n");
}
int main()
{
    int array[5] = { 1, 2, 3, 4, 5 };
    printArray(array, array, array+5);
    return 0;
}

两个代码将产生与下面可以看到的相同输出;

Array:  1  2  3  4  5

您可以看到,printArray功能将为[begin, end)范围打印功能。index实际上是指向整数数组的元素的指针,从begin开始,它包括begin,当index等于end指针时,for-loop结束,不包括处理end。我称之为半开范围

半开范围 C 会议