C 中的二维数组,t+= tab[i][j] 是什么意思?
2D array in C, what t+= tab[i][j] means?
int tab[][3] = {
{1, 2, 3},
{6, 5, 4},
{7, 8, 9}
};
main(){
int i, j, t=0;
for(i=2, j=0; i; i--, j++){
t += tab[i][j++];
printf("%d", t);
}
我不明白为什么输出是11,首先i = 2; (7, 8, 9) and j = 0 然后 t += tab[i][j++] 这意味着 7, 8, 9 + (j++ 现在是 1) (2, 5, 8) 这意味着 7 + 8 + 9 + 2 + 5 + 8?我不明白这个。 t += tab[i][j++]
两件事:
首先,您似乎假设 t += tab[i][j]
以某种方式将一个完整的向量或一行添加到 t
,即类似 (7,8,9)
的东西。然而,对 tab[i][j]
的访问代表一个特定的单元格值(不是一行),对于 i==2, j==0
,这意味着 tab[2][0]
并产生值 7
.
其次,请注意您有两个递增 j
的语句,一个在 for
部分,一个在 tab[i][j++]
中(注意 j++
)。所以当 i
减少到 1
时, j
实际上增加到 2
,这样第二个值将是 tab[1][2]
,即 4
.
那么 7 + 4 = 11
应该不再令人惊讶了:-)。
希望对您有所帮助。
首先将 printf()
更改为 printf("%d\n", t);
以在一行中查看每个 t
值。
运行 程序产生这个输出:
如您所见,我们有:7
第一个 t
、
在此之前你可以使用两个简单的for循环来打印矩阵的所有元素
并更好地了解其元素顺序。
如果你使 for 循环缩进更好,你可以解码输出结果。
拿起笔和纸,在每次迭代中画出循环变量。
for(i=2, j=0 ; i != 0 ; i--, j++ ){
t += tab[i][j++];
printf("%d\n", t);
}
第一次迭代 i:2 , j=0
因为条件 i != 0
(即 i 不等于 0 )为真,然后执行 for 的主体,我们有 t += tab[2][0];' 'tab [2][0]
指向 7
(C 中的数组索引从零开始 0
)并且由于 t 的值为 0,现在 t 为 7 并简单地打印在屏幕上。之后 j++
在 tab[i][j++]
添加一个到 j
现在 j:1
因为这个 for 迭代已经完成 for 第三部分的两个命令被执行现在 (i--, j++
) 并将值设置为 i:1 , j:2
。
我们从第二个开始进行迭代。
作为条件 i != 0
我仍然 true
我们通过 for 和
t += tab1[2]; tab[1][2] :4
并添加到 t:7
我们现在有 t:7+4=11
并在屏幕上打印 t:11
。现在 j 加一 j:3
并且此迭代完成转到第三部分 for i--,j++
我们有 i:0, j:4
。
在以后的迭代中,首先我们必须检查 for 条件 i != 0
,因为现在 i:0
这个条件是 False
,显然 for 已经完成。
这是我的版本
int tab[][3] = {
{1, 2, 3},
{6, 5, 4},
{7, 8, 9}
};
//Main Program Function, Execution Part
int main()
{
int i, j, t=0;
for (int i=0;i<3;i++){
printf("\n");
for (int j=0;j<3;j++){
printf("%d\t", tab[i][j]);
}
}
printf("\n\n");
for(i=2, j=0 ; i != 0 ; i--, j++ ){
t += tab[i][j++];
printf("%d\n", t);
}
system ("pause");
}
int tab[][3] = {
{1, 2, 3},
{6, 5, 4},
{7, 8, 9}
};
main(){
int i, j, t=0;
for(i=2, j=0; i; i--, j++){
t += tab[i][j++];
printf("%d", t);
}
我不明白为什么输出是11,首先i = 2; (7, 8, 9) and j = 0 然后 t += tab[i][j++] 这意味着 7, 8, 9 + (j++ 现在是 1) (2, 5, 8) 这意味着 7 + 8 + 9 + 2 + 5 + 8?我不明白这个。 t += tab[i][j++]
两件事:
首先,您似乎假设 t += tab[i][j]
以某种方式将一个完整的向量或一行添加到 t
,即类似 (7,8,9)
的东西。然而,对 tab[i][j]
的访问代表一个特定的单元格值(不是一行),对于 i==2, j==0
,这意味着 tab[2][0]
并产生值 7
.
其次,请注意您有两个递增 j
的语句,一个在 for
部分,一个在 tab[i][j++]
中(注意 j++
)。所以当 i
减少到 1
时, j
实际上增加到 2
,这样第二个值将是 tab[1][2]
,即 4
.
那么 7 + 4 = 11
应该不再令人惊讶了:-)。
希望对您有所帮助。
首先将 printf()
更改为 printf("%d\n", t);
以在一行中查看每个 t
值。
运行 程序产生这个输出:
如您所见,我们有:7
第一个 t
、
在此之前你可以使用两个简单的for循环来打印矩阵的所有元素 并更好地了解其元素顺序。
如果你使 for 循环缩进更好,你可以解码输出结果。 拿起笔和纸,在每次迭代中画出循环变量。
for(i=2, j=0 ; i != 0 ; i--, j++ ){
t += tab[i][j++];
printf("%d\n", t);
}
第一次迭代 i:2 , j=0
因为条件 i != 0
(即 i 不等于 0 )为真,然后执行 for 的主体,我们有 t += tab[2][0];' 'tab [2][0]
指向 7
(C 中的数组索引从零开始 0
)并且由于 t 的值为 0,现在 t 为 7 并简单地打印在屏幕上。之后 j++
在 tab[i][j++]
添加一个到 j
现在 j:1
因为这个 for 迭代已经完成 for 第三部分的两个命令被执行现在 (i--, j++
) 并将值设置为 i:1 , j:2
。
我们从第二个开始进行迭代。
作为条件 i != 0
我仍然 true
我们通过 for 和
t += tab1[2]; tab[1][2] :4
并添加到 t:7
我们现在有 t:7+4=11
并在屏幕上打印 t:11
。现在 j 加一 j:3
并且此迭代完成转到第三部分 for i--,j++
我们有 i:0, j:4
。
在以后的迭代中,首先我们必须检查 for 条件 i != 0
,因为现在 i:0
这个条件是 False
,显然 for 已经完成。
这是我的版本
int tab[][3] = {
{1, 2, 3},
{6, 5, 4},
{7, 8, 9}
};
//Main Program Function, Execution Part
int main()
{
int i, j, t=0;
for (int i=0;i<3;i++){
printf("\n");
for (int j=0;j<3;j++){
printf("%d\t", tab[i][j]);
}
}
printf("\n\n");
for(i=2, j=0 ; i != 0 ; i--, j++ ){
t += tab[i][j++];
printf("%d\n", t);
}
system ("pause");
}