c - 我是不是想多了?

标签 c

我遇到了以下作业问题:

考虑以下 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;

关于c - 我是不是想多了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49102869/

相关文章:

c++ - 增加堆栈大小以使用 alloca()?

c - STM32f4xx标准外设库说明

c - 为什么我的按钮在使用 C 的 SDL2 中不起作用?

c - 读取下一个节点在链表中的内存位置

C:图中的邻接列表 - 段错误

c - 如何从用户空间访问和更改内核空间的变量

c++ - mupdf - 错误的宏

c - 使用 getchar() 获取未知长度的整数

c - C 中的 qsort( ) 函数

c++ - 1000LL 中的 LL 是什么意思?