我遇到了以下作业问题:
考虑以下 C 程序段。不使用 goto 或 breaks 重写它。
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。我是不是想多了?
j will just end up being j = 3 - i(2) which is 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;
我是一名优秀的程序员,十分优秀!