1447391641 发表于 2020-12-7 10:19:17

程序运行

#include <stdio.h>
int main ( )
{
int a = 15, b = 21, m = 0;
switch (a % 3)
{
case 0: m++; break;       这个break是连下一个switch也跳出了吗,为什么不执行下面那个switch语句了
case 1:m++;
switch(b % 2)
{
default: m++;
case 0:m++; break;
}
}
printf("%d\n", m);
}

风过无痕1989 发表于 2020-12-7 19:47:27

你这个程序想干什么,搞不懂
就你提出的问题,回答如下:
1、break 只在本作用域起作用,不会影响到作用域外其他的程序段
2、下面那么 switch 语句没有执行,并非是上面的 break ,而是因为你下面那个程序段,没有对应的 case,b % 2 = 21 % 2 = 1,下面只有 case 0,没有 case 1

城头有平安 发表于 2020-12-7 21:55:46

风过无痕1989 发表于 2020-12-7 19:47
你这个程序想干什么,搞不懂
就你提出的问题,回答如下:
1、break 只在本作用域起作用,不会影响到作用 ...

哥们,我的记忆里switch 的 break;是跳出整个循环的。
不信你去调试一下,程序到break是直接到printf的 和下面的switch根本没有关系好吗
实在不行 你去看这个https://blog.csdn.net/Alices_zhu/article/details/82462982

1447391641 发表于 2020-12-8 13:45:35

城头有平安 发表于 2020-12-7 21:55
哥们,我的记忆里switch 的 break;是跳出整个循环的。
不信你去调试一下,程序到break是直接到printf的...

break跳出不是只跳出一个循环吗

1447391641 发表于 2020-12-8 13:47:09

风过无痕1989 发表于 2020-12-7 19:47
你这个程序想干什么,搞不懂
就你提出的问题,回答如下:
1、break 只在本作用域起作用,不会影响到作用 ...

那第二个switch里面的个default也不执行吗

rt3 发表于 2020-12-8 13:48:47

本帖最后由 rt3 于 2020-12-8 13:57 编辑

第2个 switch是 在 执行 第1个 switch 语句的 case 1段时才会调用。
为了便于理解,对你的代码添加了一些缩进,以及几个用于调试的printf语句,并变更了a的值
#include <stdio.h>
int main ( )
{
    int a = 16, b = 21, m = 0;
    switch(a%3){
    case 0:
      m++;
      break;       //这个break是连下一个switch也跳出了吗,为什么不执行下面那个switch语句了
    case 1:
      m++;
      switch(b%2){
            default:
                m++;
            case 0:
                printf("switch 2 case 0.\n");
                m++;
                break;
      }
   printf("switch 1 case 1.\n");
    }
    printf("%d\n", m);
}


1447391641 发表于 2020-12-8 13:53:59

rt3 发表于 2020-12-8 13:48
第2个 switch是 在 执行 第1个 switch 语句的 case 1段时才会调用。
为了便于理解,对你的代码添加了一 ...

但是我那个输出结果是1,这个是3呀

rt3 发表于 2020-12-8 13:55:39

1447391641 发表于 2020-12-8 13:53
但是我那个输出结果是1,这个是3呀

输出3是因为修改了a的值。这样改是为了说明两个switch语句之间的从属关系。
改回去就输出1了。

1447391641 发表于 2020-12-8 13:57:51

rt3 发表于 2020-12-8 13:55
输出3是因为修改了a的值。这样改是为了说明两个switch语句之间的从属关系。
改回去就输出1了。

懂了

1447391641 发表于 2020-12-8 13:58:44

rt3 发表于 2020-12-8 13:55
输出3是因为修改了a的值。这样改是为了说明两个switch语句之间的从属关系。
改回去就输出1了。

这个是看花括号看出来的第二个switch在第一个switch里面吧

rt3 发表于 2020-12-8 13:59:11

1447391641 发表于 2020-12-8 13:58
这个是看花括号看出来的第二个switch在第一个switch里面吧

是的

风过无痕1989 发表于 2020-12-8 14:21:49

城头有平安 发表于 2020-12-7 21:55
哥们,我的记忆里switch 的 break;是跳出整个循环的。
不信你去调试一下,程序到break是直接到printf的...

break 是跳出当前的循环,怎么可能是跳出整个的循环?一个 switch 就是一个循环,怎么可能连下面那个循环都跳出?再举以下的例子:
for(i = 0;i < 10;i++)
{
    for(j = 0;j < 10;j++)
    {
         . . .
          break;
   }
}
break 只能是跳出 j 循环,绝对不可能跳出 i 循环

城头有平安 发表于 2020-12-8 23:03:25

风过无痕1989 发表于 2020-12-8 14:21
break 是跳出当前的循环,怎么可能是跳出整个的循环?一个 switch 就是一个循环,怎么可能连下面那个循环 ...

是的呀,进不去怎么跳,第一个break在外面那个大的循环里啊,直接跳出去了,没有机会进第二个switch的
你这个程序跳的也是和他相关的for啊,那个break和他相关的就是第一个switch。哥们实在不信你去单步走一下,单步走到那个break的时候,下一步直接是printf了{:10_245:}
页: [1]
查看完整版本: 程序运行