我遇到了以下作业问题:
考虑以下C程序段。不使用goto或中断重写它。
j = -3;
for (i = 0; i < 3; i++) {
switch (j + 2) {
case 3:
case 2: j--;
break;
case 0: j += 2; break;
default: j = 0;
}
if (j > 0) break;
j = 3 - i;
}
在研究了几分钟之后,我得出的结论是代码段只会产生j = 1.除非我错了,case语句永远不会产生任何东西但是默认,并且在i = 2迭代之后循环,j将最终成为j = 3 - i(2)即1.我是否过度思考这个?
答案 0 :(得分:1)
j将最终成为j = 3 - i(2),即1
正确:
#include<stdio.h>
int main(void)
{
int i,j;
j = -3;
for (i = 0; i < 3; i++)
{
switch (j + 2)
{ // j = -1 ->
case 3:
printf("3\n");
case 2: j--;
printf("2\n");
break;
case 0:
j += 2;
printf("0\n");
break;
default:
j = 0;
printf("j=%d i=%d default:\n", j, i);
}
if (j > 0){
printf("j>0\n");
break;
}
j = 3 - i;
printf("j=3-i j=%d i=%d \n", j, i);
}
printf("j=%d i=%d END\n", j, i);
return 0;
}
输出:
j=0 i=0 default:
j=3-i j=3 i=0
j=0 i=1 default:
j=3-i j=2 i=1
j=0 i=2 default:
j=3-i j=1 i=2
j=1 i=3 END
因此,对于上面的代码,最小的简化是:
j = 1;
i = 3;