c程序设计第三版何钦铭第四章课后题

5.阅读下列程序并回答问题。


int main(void) 
{ int i, j, k=0, m=0; 
 for(i=0; i<2; i++) 
 { 
; /* 第 5 行*/ 
 for(j=0; j<3; j++) 
 k++; 
 m++; /* 第 9 行*/ 
 } 
 printf("k=%d, m=%d\n", k, m); 
} 

(1) 程序的输出是 k=6,m=2 。
(2) 将第 8 行改为 " m=m+k; " ,程序的输出是 k=6,m=9 。
(3) 将第 5 行改为 "k=0;" ,将第 8 行改为 " m=m+k; " ,程序的输出是
k=3,m=6

第一问的结果m不应该是6吗,为什么会是2;我用dev跑了结果也是m=2,但我没看懂,求大家解惑。
第二三问m的值同求答案

(1) 当第一个循环执行完毕后,k 的值为 6,m 的值为 2,因为 k 会被累加 6 次,而 m 只会被累加 2 次。

(2) 如果将第 8 行改为 "m=m+k;",那么当第一个循环执行完毕后,k 的值为 6,m 的值为 9。这是因为 m 会被累加 2 次,而每次累加的值为 k 的当前值,因此第一次累加时 m 的值为 6,第二次累加时 m 的值为 6+6=12,但第二个循环只执行了一次,所以最终 m 的值为 9。

(3) 如果将第 5 行改为 "k=0;",那么 k 的值在每个循环开始时都会被重置为 0。当第一个循环执行完毕后,k 的值为 3,m 的值为 6。在第一个循环中,k 的值被累加了 3 次,而 m 的值被累加了 2 次;在第二个循环中,k 的值被累加了 3 次,而 m 的值被累加了 1 次,因此最终的输出为 k=3,m=6。

仔细看,第二个循环没有加大括号,只执行了k++这一行代码,m++并没有在第二个循环里