C中的二维数组,什么t + = tab [i] [j]的意思是?
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,首先我= 2; (7,8,9)和j = 0,然后t + = tab [i] [j ++]这意味着7,8,9 +(j ++现在为1)(2,5,8),这意味着7 + 8 + 9 + 2 + 5 + 8?我不明白这一点。 T + =标签[i] [j ++]C中的二维数组,什么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(i=2, j=0 ; i != 0 ; i--, j++){
t += tab[i][j++];
printf("%d\n", t);
}
第一迭代i:2 , j=0
作为条件i != 0
(即i的不等于0)为真,则执行的身体和我们有t += tab[2][0];' 'tab [2][0]
指向7
(在C数组索引从零0
开始)和由于t的值是0,现在t保持7并且只是在屏幕上打印。之后j++
在选项卡[i] [j++]
中添加一个到j
,现在j:1
,因为此迭代已完成,现在执行for的第三部分中的两个命令(i--, j++
)并将值设置为i:1 , j:2
。 我们从迭代开始。 作为条件i != 0
我仍然true
我们通过对内部和 吨+ =标签1 [2]; tab[1][2] :4
并添加到t:7
我们现在t:7+4=11
和打印t:11
在屏幕上。现在通过一个j:3
加入j和这个迭代结束对i--,j++
我们i:0, j:4
转到第三部分。 在稍后的迭代中,首先我们必须检查条件i != 0
与现在一样i:0
这个条件是False
,显然是完成。
这是我的版本
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");
}
这是一个矩阵。示例选项卡[1] [1]将是{6,5,8} [1],即5 – Parker
使用调试器并逐步执行代码。你会看到它到底在做什么。 –
@皮克谢谢,我明白了。但你的意思是{6,5,4}对不对? – Shadow