为什么C++数组反转两次恢复原数组时会出现负整数?
问题解决方案
根因定位
reverseArray函数内的元素赋值逻辑存在运算符优先级错误,你编写的*pointEnd - i实际执行顺序是先解引用pointEnd拿到对应值,再将该值减去i,和你预期的「先将指针pointEnd向前偏移i位再解引用取值」的逻辑完全不符。
修正方案
将错误行
temparr[i] = *pointEnd - i;
修改为
temparr[i] = *(pointEnd - i);
即可实现正常的两次反转恢复原数组的效果。
异常现象解释
- 第一次调用反转看起来正常:你初始数组元素是
0~49递增排列,首次调用时pointEnd指向最后一个元素值为49,*pointEnd -i的结果恰好等于49-i,刚好和反转后的预期值重合,所以第一次输出无异常。 - 第二次调用出现负数:首次反转后数组末位元素值为0,第二次调用时
pointEnd指向该0值,执行*pointEnd -i就会得到0-i的负数结果,符合你遇到的异常表现。
额外优化建议
你代码中int temparr[arrayLength];属于C语言的变长数组(VLA)特性,不属于标准C++语法规范,部分编译器可能不支持该写法,更规范的实现可以直接在原数组上交换首尾元素,不需要额外开辟临时数组,示例如下:
void reverseArray(int arrayLength, int sequence[]) { int *pointStart = sequence; int *pointEnd = sequence + arrayLength - 1; while (pointStart < pointEnd) { int temp = *pointStart; *pointStart = *pointEnd; *pointEnd = temp; pointStart++; pointEnd--; } }
内容的提问来源于stack exchange,提问作者Connor Ronnoc
相关产品推荐
相关产品推荐

