为什么C++中计算二维数组行差的for循环会输出不合理多余结果
问题原因
- 多余内层循环导致输出次数超出预期:你仅需要遍历3次相邻行对(对应i从0到2),但额外添加了
j < 2的内层循环,每组行对会执行2次求和、输出逻辑,最终总输出次数为3*2=6次,和你预期的3次不符。 - 求和逻辑重复且存在数组越界风险:内层单次j循环已经直接计算了当前行对3个列的差值总和,完全不需要遍历j;且当j=1时访问
v[i][j+2]等同于访问v[i][3],你的数组仅3列,合法索引为0、1、2,越界访问会读取到未知内存值,也可能导致结果异常。
修正代码
你只需要删掉多余的内层j循环即可,示例如下:
#include <iostream> #include <vector> using namespace std; int main() { int v[4][3] = { {1,2,3}, {3,4,5}, {6,7,8}, {9,10,11} }; cout << sizeof(v) << "\n"; float sq = 0; for(int i = 0; i < 3; ++i){ // 直接计算当前相邻行的差值总和 float curr_diff = (v[i+1][0] - v[i][0]) + (v[i+1][1] - v[i][1]) + (v[i+1][2] - v[i][2]); sq += curr_diff; // 如果要输出当前行对的差值就输出curr_diff,要输出累计和就输出sq cout << "diff " << curr_diff << endl; } cout << "final square of the numbers: " << sq << endl; return 0; }
运行后会输出3个行对的差值:6、9、9,符合你的预期。
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

