查找数组最大最小元素的C++代码逻辑错误该如何排查?
代码问题分析
- 数组越界访问
两个函数的遍历条件都是for (int i = 0; i < b; i++),循环内访问a[i+1],当i等于b-1时,i+1等于数组长度b,超出了数组合法下标范围(C++数组下标从0开始,合法范围是0~b-1),越界访问属于未定义行为,会输出随机值甚至程序崩溃。 - 线性搜索逻辑冗余
你设计的是线性搜索定位最值,不需要每次比较相邻两个元素,直接遍历每个元素和当前存储的最值比较即可,现有逻辑属于不必要的复杂写法,反而容易出错。 - 非标准可变长度数组
main函数中int arr[n];的写法是C语言的VLA扩展,不属于C++标准语法,可移植性差,建议改用标准库容器vector存储动态长度数组。
修正后代码
#include <iostream> #include <climits> #include <vector> using namespace std; void maxElement(const vector<int>& a) { int maxNum = INT_MIN; for (int num : a) { maxNum = max(maxNum, num); } cout << maxNum << endl; } void minElement(const vector<int>& c) { int minNum = INT_MAX; for (int num : c) { minNum = min(minNum, num); } cout << minNum << endl; } int main() { int n; cin >> n; vector<int> arr(n); for (int i = 0; i < n; i++) { cin >> arr[i]; } minElement(arr); maxElement(arr); return 0; }
如果你要保留原有C风格数组的写法,仅调整循环逻辑即可:
// maxElement调整示例,minElement同理修改 void maxElement(int a[], int b) { int maxNum = INT_MIN; for (int i = 0; i < b; i++) { maxNum = max(maxNum, a[i]); } cout << maxNum << endl; }
内容的提问来源于stack exchange,提问作者Parth Tiwari
相关产品推荐
相关产品推荐

