共有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
*/
}
答案 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。