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");
}