切换大小写奇怪的范围

2024-03-11

在查看一些第 3 方 C 代码时,我遇到了类似的情况:

switch (state) {
case 0: 
    if (c=='A') { // open brace
        // code...
    break; // brace not closed!
case 1:
    // code...
    break;
    } // close brace!
case 2:
    // code...
    break;
}

我正在审查的代码中似乎只是一个拼写错误,但令我惊讶的是它编译时没有错误。

为什么这是有效的 C?
与在预期位置关闭大括号相比,此代码的执行有何影响?
有没有什么情况可以使用这个?

编辑:在示例中,我查看了所有中断是否存在(如上所述) - 但答案还可以包括在情况 0 或 1 中中断不存在时的行为。


它不仅有效,而且在实际代码中也使用了类似的结构,例如,达夫的装置 http://en.wikipedia.org/wiki/Duff%27s_device,这是一个用于复制缓冲区的展开循环:

send(to, from, count)
register short *to, *from;
register count;
{
        register n = (count + 7) / 8;
        switch(count % 8) {
        case 0: do {    *to = *from++;
        case 7:         *to = *from++;
        case 6:         *to = *from++;
        case 5:         *to = *from++;
        case 4:         *to = *from++;
        case 3:         *to = *from++;
        case 2:         *to = *from++;
        case 1:         *to = *from++;
                } while(--n > 0);
        }
}

Since a switch语句实际上只是计算一个地址并跳转到它,很容易看出为什么它可以与其他控制结构重叠;其他控制结构中的行也有可以作为跳转目标的地址!

在您提出的情况下,想象一下如果没有switch or break在你的代码中。当你完成执行后then的一部分if声明,你只要继续前进,那么你就会陷入困境case 2:。现在,既然你已经有了switch and break,这很重要break可以挣脱出来。根据MSDN 页面,“C break 语句” http://msdn.microsoft.com/en-us/library/wt88dxx6%28v=vs.80%29.aspx,

The break语句终止最近的封闭语句的执行do, for, switch, or while它出现的声明。控制权传递到终止语句后面的语句。

由于最近的封闭do, for, switch, or while声明是你的switch(请注意if不包含在该列表中),那么如果您在then块,你转移到外面switch陈述。不过,更有趣的是,如果您输入,会发生什么case 0, but c == 'A'是假的。然后if将控制权转移到右大括号之后then块,然后您开始执行中的代码case 2.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

切换大小写奇怪的范围 的相关文章

  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud

随机推荐

  • 在 Python 中从图像中提取连接的对象

    我有一个graysacle png 图像 我想从图像中提取所有连接的组件 有些组件具有相同的强度 但我想为每个对象分配一个唯一的标签 这是我的图片 我尝试了这段代码 img imread images soccer cif str i zf
  • @EnableMongoAuditing 和 @CreatedDate 审核在 Spring Boot 2.4.3 中不起作用

    我正在关注这个例子https github com hantsy spring reactive sample blob master boot exception handler src main java com example dem
  • jquery地址怎么用呢?

    我试图了解如何使用 jQuery 地址插件来处理 ajax 的深度链接 但文档非常差 我找不到任何好的教程来解释正在发生的事情 我认为一个好的文档和好的例子对于每个插件都很重要 有人可以解释或提供一些有用的解释链接吗 address cha
  • codeigniter $this->upload->do_upload() = false

    我正在尝试上传文件 我选择一个文件然后提交它 但 this gt upload gt do upload 的结果始终为 false 这是我的表格
  • subprocess.Popen execve() arg 3 包含非字符串值

    我正在尝试通过 shell 运行另一个脚本 该脚本使用一组修改后的环境变量 def cgi call script environ pSCRIPT subprocess Popen script stdout subprocess PIPE
  • 替换失败是否是依赖非类型模板参数的错误?

    假设我有这些模板别名 enum class enabler template
  • “出于安全原因”pcntl 无法在 Ubuntu 上运行

    我已经在 Ubuntu 32 位 12 10 上运行的 PHP 5 4 6 上安装了 pcntl 使用this http www crimulus com 2010 07 30 howto enable pcntl in ubuntu ph
  • 包含声明

    我不明白的重要性CONTAINSFortran 90 中的声明 例如 PROGRAM BLABLA IMPLICIT NONE INTEGER i j k i 1 j 1 k 1 PRINT i j k CALL ABC i j k PRI
  • Gtk-CRITICAL **:IA__gtk_widget_style_get:断言“GTK_IS_WIDGET(小部件)”失败

    在静态构建我的 qt 应用程序之后 configure static debug and release confirm license nomake demos nomake examples nomake tools 它工作正常 但我收
  • 如何使固定大小的主体(或div)始终保持在页面的中心(甚至垂直!)

    我试图使 1024x768 的主体始终保持在页面的中心 上下间距相同 左右间距也相同 但是我在执行此操作时遇到了麻烦 我用的是trick距顶部的间距为 50 然后我将主体 绝对 定位在 384px 即 768 的一半 然而这种方法给我带来了
  • Yii 单选按钮

    我在 Yii 中使用单选按钮 无论我做什么 我都无法获取要发布的所选按钮的值 我确信这只是简单的事情 我没有使用 radioButtonList 因为我希望每个按钮都存在于其自己的 div 中 并在其上方有一个图像 这是我从视图中看到的代码
  • 为什么 Scala 在按名称参数重载时的行为与按值参数重载时的行为不同?

    鉴于以下 Scala 代码 object test def byval a Int println Int def byval a Long println Long def byname a gt Int println gt Int d
  • 为什么 [regex] match() 和 -match 不同?

    当我在 PowerShell 中使用正则表达式时 我偶然发现了一个与 Powershell 不同的奇怪场景 regex 班级匹配 match 在我尝试从字符串中删除空行的情况下 当使用 replace我的表情在与时都不起作用 regex r
  • 如何散列 std::string?

    我正在制作一个小实用程序来帮助我通过重复来记住密码 我想每天只输入一次密码 而不是在每次会话之前输入 当然 我不会存储密码本身 但很乐意存储其哈希值 那么 获取哈希值的最简单方法是什么std string使用 C 标准库 对于不涉及外部库的
  • 多重继承和指针实现

    给出以下代码 namespace Example1 class A public A virtual A private float data A class B public B virtual B protected float dat
  • viewpager和fragment中布局的幽灵

    I use the viewpager and fragment the adapter is FragmentStatePagerAdapter fragment s layout i use is SwipeRefreshLayout
  • 分配器类型参数的 C++ 设计模式

    C 03 标准库在将类型传递给旨在作为分配器的类时使用简单的模板类型参数 这是可能的 因为模板在 C 中的工作方式 但是 它并不是很简单 您可能不知道类型定义到底应该是什么样子 特别是在非标准类型的情况下 我认为使用适配器类可能是个好主意
  • vue动态mapGetters

    我有一个 props 我想用它来制作动态 mapGetters 但是 mapGetters 将 props 视为未定义 可能是因为计算值是在 props 之前加载的 有人知道我怎样才能让它变得动态吗 我的代码如下 export defaul
  • 从 VSCode 中删除 git 集成

    我下载了 Visual Studio Code 来在工作中试用 我几乎爱上了它的一切 但我不喜欢的一部分是 Git 集成 我导入了整个工作文件夹 约 14000 个源文件 git 项目 Visual Studio Code 中的布局和所有内
  • 切换大小写奇怪的范围

    在查看一些第 3 方 C 代码时 我遇到了类似的情况 switch state case 0 if c A open brace code break brace not closed case 1 code break close bra