【发布时间】:2018-12-31 10:19:26
【问题描述】:
有 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
*/
}
【问题讨论】:
-
在同一个函数调用的多个参数中使用
j++会产生未定义的行为。 -
#2 中的内部
for循环有什么意义?它只会执行一次,因为j += 4立即到达末尾。 -
哪个
printf给出了意想不到的结果? -
循环 #2 的点仅用于演示。即使是床代码练习,它也可以正常工作。循环 #3 令人困惑。