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]的意思是?

+0

这是一个矩阵。示例选项卡[1] [1]将是{6,5,8} [1],即5 – Parker

+2

使用调试器并逐步执行代码。你会看到它到底在做什么。 –

+0

@皮克谢谢,我明白了。但你的意思是{6,5,4}对不对? – Shadow

两件事情:

首先,你似乎认为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下降到1j实际上已经提高到2,使得第二值将是tab[1][2],这是4

然后7 + 4 = 11不应该再是一个惊喜:-)。

希望它有帮助。

第一次更改printf()printf("%d\n", t);在一行中看到每个t的值。

运行程序产生这样的输出:

program output

正如你看到的,我们有: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"); 
}