我目前正在使用C语言操作数组,我对为什么在与数组相关的操作中通常使用dim-1感到有点困惑.如果dim指定了数组中的数据量,使用dim-1不会潜在地导致丢失一个元素吗?

例如,在冒泡排序算法的上下文中,通常使用: for (int i = 0; i < dim - 1; i++). 这次大会有什么特别的原因吗? 我是通过将索引初始化为1还是将其设置为DIM-1来丢失元素?

我试着不使用这个约定,它似乎也能正常工作,但它被标记为不正确.

推荐答案

你是对的.为大小为dim的数组中的每个元素执行或判断某些操作的循环通常被编程为for (int i = 0; i < dim; i++),它可以让您每次迭代一次,并为i提供适合于寻址每个数组元素的值.(当然是基于0的,即从索引0开始.

But many algorithms, notable the bubble sort which you are mentioning, look at each possible pair of neighboring elements. I.e. you look at each i and at i+1 as index, through the whole array. But doing that you need to stop BEFORE the last usually available i (being dim-1), because you cannot use dim -1 +1 for the other part of the last pair. So the last pair is dim-2 and dim-1.
A loop that will allow you in each iteration to access i and i+1 and end up using dim-2 and dim-1 is

for (int i = 0; i < dim - 1; i++)

这就是为什么.

(这非常接近詹姆斯·K·波尔克总统的 comments ,但我认为将 comments 转化为答案是可以的,我对此进行了实质性的扩展.此外,我在意识到这条 comments 存在之前也打了字,但这可能不是一个借口……:-))

C++相关问答推荐

Pure Win32 C(++)-除了替换控件的窗口程序之外,还有其他方法可以在输入时禁用按钮吗?

GCC预处理宏和#杂注GCC展开

识别和处理c中整数溢出的最佳方法?

在传统操作系统上可以在虚拟0x0写入吗?

Clang:如何强制运行时错误的崩溃/异常由于-fsanitize=undefined

整型文字后缀在左移中的用途

为什么双精度d=flt_max+flt_max;在c语言中得到inf的结果

覆盖读取函数,但当文件描述符为3或4时,我有问题

这个空指针类型的转换是有效代码还是恶意代码?

为什么GCC-O1优化破解了这个代码,为了一个GameBoy高级只读存储器而修改了VRAM的循环?

Realloc():中止的下一个大小无效(核心转储)

有没有办法减少C语言中线程的堆大小?

如何组合两个宏来初始化C语言中的字符串数组?

OMP并行嵌套循环

c如何传递对 struct 数组的引用,而不是设置 struct 的副本

通过修改c中的合并排序对数组的偶数索引进行排序

SSE 向量与 Epsilon 的比较

clion.我无法理解 Clion 中发生的 scanf 错误

C 中从 Unix 纪元时间转换的损坏

为什么需要struct in_addr