我在想这个吗?

时间:2018-03-05 02:58:59

标签: c

我遇到了以下作业问题:

考虑以下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.我是否过度思考这个?

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;