C语言数组操作中dim-1的疑问:是否会丢失数组元素?
关于C数组操作里dim-1的常见用法解析
先搞清楚最基础的:C语言数组的索引是从0开始的,如果dim是数组的元素总数,那最后一个元素的索引就是dim-1——这是所有这类写法的核心原因。
为啥冒泡排序要写for (int i = 0; i < dim - 1; i++)?
冒泡排序的逻辑是每一轮把当前没排好的元素里最大的那个“推”到末尾。比如数组有dim个元素:
- 第1轮跑完,最大的元素会被放到最后一个位置(索引
dim-1); - 第2轮跑完,第二大的元素会被放到倒数第二个位置(索引
dim-2); - ...
- 跑到第
dim-1轮的时候,倒数第二个元素会归位,剩下的第一个元素自然是最小的,根本不需要再跑第dim轮——这就把所有dim个元素都排好了,没漏掉任何一个。
要是你改成i < dim,多跑的那一轮完全是无用功,甚至如果内层循环逻辑没对应调整,还可能出现数组越界访问的问题(比如访问到数组范围外的内存)。
用dim-1会不会丢元素?
绝对不会。别把循环次数和元素个数搞混了:外层循环跑dim-1次,但每一次循环都会处理多个未排序的元素,最终所有dim个元素都会被处理到,排序结果是完整的。
初始化索引为1会咋样?
C数组默认从0开始计数,如果你硬把索引初始化成1,那第一个元素(索引0)直接就被跳过了——这才是真的丢元素。比如你要遍历数组打印所有元素,写for(int i=1; i<dim; i++),第一个元素根本不会被打印出来。
为啥自己改了程序看似正常但被判错?
多半是你测试的例子刚好没触发问题,比如数组本来就是有序的,或者越界访问的内存刚好没搞崩程序,但这种写法本质是违规的,C语言不保证这种情况下程序的行为,换个测试用例或者运行环境,大概率会输出错误结果甚至直接崩溃。判错是因为你的代码逻辑不符合算法的正确要求,要么效率低,要么有潜在的致命问题。
内容的提问来源于stack exchange,提问作者DavideN7
相关产品推荐
相关产品推荐

