首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >开关:没有外壳的开关

开关:没有外壳的开关
EN

Stack Overflow用户
提问于 2020-01-27 11:44:25
回答 4查看 119关注 0票数 2

下面有一个没有switchbreak

代码语言:javascript
复制
char c = 'a';
switch(c) {
    break;
    case 'a' : cout << 'a' << endl;
    break;
    case 'b' : cout << 'b' << endl;
    break;
    default : break;
}

为什么这个代码片段会打印a?在遇到第一条break语句后,开关不应该中断吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-01-27 11:49:37

第一个break被忽略。

switch(c),运行时跳到case 'a'作为c=='a'。之前的一切都被忽略了。

这就是为什么case 'b'在不打印'a'的情况下工作,这也是为什么在switch块中不允许变量定义的原因:

代码语言:javascript
复制
int n=0;
switch (n)
{
    int k=n;
case 0:
    return k; // UB
}
票数 4
EN

Stack Overflow用户

发布于 2020-01-27 11:57:20

在C中,caseswitch中是(类似于) goto标签。switch的头类似于goto本身。

后果

  • 通常必须使用break,因为“登录”是基于goto的(非结构化的或单一的入口和出口点)。
  • 从未到达第一个case之前的任何语句
  • 著名用法杜夫装置
票数 1
EN

Stack Overflow用户

发布于 2020-01-27 12:05:51

switch是一系列丑陋的ifgoto的紧凑和可读的形式,否则:

代码语言:javascript
复制
char c = 'a';
if(c=='a')goto _a;         // test for "case 'a':"
if(c=='b')goto _b;         // test for "case 'b':"
goto _default;             // unconditional jump to "default:"
goto _break;               // <-- program never goes to this line, the one you are asking about
_a: cout << 'a' << endl;
goto _break;
_b: cout << 'b' << endl;
goto _break;
_default:
goto _break;
_break:

测试:https://ideone.com/OgsQuT

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59930503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档