C++ 在为矩阵列 (v[i][j-1]) 的前导元素赋值时的奇怪行为
C++ Weird behavior while giving a value to the the predecessor element of a matrix column (v[i][j-1])
所以我试图制作一个矩阵,其中主对角线的元素将逐个增加 3,我还想更改主对角线的前一个和下一个元素的值及其前身和继任者。
Something like this:
在前任元素之前一切正常。由于某种原因 v[i][j-1] 不起作用?
我想说我是初学者。
代码如下:
#include <iostream>
using namespace std;
int n, v[22][22];
int main()
{
cin >> n;
int k = 1;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i == j)
{
v[i][j] = k;
v[i][j + 1] = k + 1;
v[i][j - 1] = k - 1; //this is the part where it doesn't work
}
cout << v[i][j] << " ";
}
k += 3;
cout << "\n";
}
}
Here is the result I am getting
编辑:我也试过i和j都是从1开始的,所以不会有负的索引值。还是不行。
对于初学者来说,不需要使用嵌套的 for 循环。只用一个for循环就够了
当 i 等于 0 且 j 等于 0 时,此表达式 v[i][j - 1] 访问调用未定义行为的数组外的内存。
当表达式的 n 等于 22 并且 i 和 j 等于 n - 1 时存在同样的问题v[i][j + 1]
。
你应该检查这些情况。
而这个输出
cout << v[i][j] << " ";
可能会在 v[i][j-1]
尚未更新时出现。
同时尝试在使用变量的最小范围内声明变量。例如不需要在全局命名空间中声明数组。
这里展示了如何组织循环。
int value = 1;
for (size_t i = 0; i < n; i++)
{
v[i][i] = value;
if (i != 0) v[i][i - 1] = value - 1;
if (i != n - 1) v[i][i + 1] = value + 1;
value += 3;
}
for (const auto &row : v)
{
for (const auto &item : row)
{
std::cout << std::setw( 3 ) << item << ' ';
}
std::cout << '\n';
}
例如,如果 n 等于 5,则输出将为
1 2 0 0 0
3 4 5 0 0
0 6 7 8 0
0 0 9 10 11
0 0 0 12 13
所以我试图制作一个矩阵,其中主对角线的元素将逐个增加 3,我还想更改主对角线的前一个和下一个元素的值及其前身和继任者。 Something like this:
在前任元素之前一切正常。由于某种原因 v[i][j-1] 不起作用?
我想说我是初学者。
代码如下:
#include <iostream>
using namespace std;
int n, v[22][22];
int main()
{
cin >> n;
int k = 1;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i == j)
{
v[i][j] = k;
v[i][j + 1] = k + 1;
v[i][j - 1] = k - 1; //this is the part where it doesn't work
}
cout << v[i][j] << " ";
}
k += 3;
cout << "\n";
}
}
Here is the result I am getting
编辑:我也试过i和j都是从1开始的,所以不会有负的索引值。还是不行。
对于初学者来说,不需要使用嵌套的 for 循环。只用一个for循环就够了
当 i 等于 0 且 j 等于 0 时,此表达式 v[i][j - 1] 访问调用未定义行为的数组外的内存。
当表达式的 n 等于 22 并且 i 和 j 等于 n - 1 时存在同样的问题v[i][j + 1]
。
你应该检查这些情况。
而这个输出
cout << v[i][j] << " ";
可能会在 v[i][j-1]
尚未更新时出现。
同时尝试在使用变量的最小范围内声明变量。例如不需要在全局命名空间中声明数组。
这里展示了如何组织循环。
int value = 1;
for (size_t i = 0; i < n; i++)
{
v[i][i] = value;
if (i != 0) v[i][i - 1] = value - 1;
if (i != n - 1) v[i][i + 1] = value + 1;
value += 3;
}
for (const auto &row : v)
{
for (const auto &item : row)
{
std::cout << std::setw( 3 ) << item << ' ';
}
std::cout << '\n';
}
例如,如果 n 等于 5,则输出将为
1 2 0 0 0
3 4 5 0 0
0 6 7 8 0
0 0 9 10 11
0 0 0 12 13