循环3中的printf()函数产生意外结果

时间:2018-07-23 21:52:34

标签: c c99 c11

共有3个循环,最后一个循环的行为不符合预期。 循环#2和循环#3是错误的代码样式。他们在这里只是为了示范。问题是为什么循环3中的printf()提供意外的输出而循环2中的printf()提供预期的结果?是由于编译器还是因为printf函数导致此错误?是否有任何文件解释在某些情况下编译器或某些函数的行为,以便我寻找将来的问题。

int main(void){

int mat1[3][4] = {4,5,0,3,0,0,1,2,0,0,0,6};

//****************** Output 1 ***********************************************

    for(int i=0; i<3;i++)
        for(int j=0;j<4;j++){
            printf("%d, ", mat1[i][j]);
            if(j==3)printf("\n");
        }


    /*   Expected output 1:

        4 5 0 3 
        0 0 1 2 
        0 0 0 6
    */

    printf("\n\n");

//******************* Output 2 ************************************************ 

    for(int i=0; i<3;i++)
        for(int j=0;j<4;j+=4)

            printf("\n%d, %d, %d, %d", mat1[i][j+0],mat1[i][j+1],mat1[i][j+2],mat1[i][j+3]);



    /*  Expected output 2:

        4 5 0 3 
        0 0 1 2 
        0 0 0 6
    */

    printf("\n\n");

//********************* Output 3 **********************************************

    for(int i=0; i<3;i++)
        for(int j=0;j<4;j)

            printf("\n%d, %d, %d, %d", mat1[i][j++],mat1[i][j++],mat1[i][j++],mat1[i][j++]);


    /*  Unexpected output 3:

        3 0 5 4 
        2 1 0 0 
        6 0 0 0
    */

}

1 个答案:

答案 0 :(得分:0)

    printf("\n%d, %d, %d, %d", mat1[i][j++],mat1[i][j++],mat1[i][j++],mat1[i][j++]);

那是非常糟糕的编码风格,但是发生的事情是printf在打印出j之前从右到左评估j。因此,这就是为什么在第一个mat1 [i] [j ++] j将为3,在第二个是2,依此类推,直到最后一个mat1 [i] [j ++]将具有j将为0。