c中switch语句中的多个变量

2024-03-21

如何使用c中的switch语句在c中编写以下语句

int i = 10;
int j = 20;

    if (i == 10 && j == 20)
    {
       Mymethod();
    }
    else if (i == 100 && j == 200)
    {
       Yourmethod();
    }
    else if (i == 1000 || j == 2000) // OR
    {
       Anymethod();
    }

EDIT:

我稍后将最后一个案例从“and”更改为“or”。因此,我向在此编辑之前回答我的问题的人致歉。

例如这个场景,我只是想知道是否可能。我用谷歌搜索了一下,发现这是不可能的,但我更相信 stackoverflow 上的专家。

Thanks


您迫切需要答案,这将不自然地迫使此代码变成switch- 对于您所描述的问题,这不是 C、C++ 或 C# 的正确方法。与if语句,如使用switch在这种情况下,会导致代码可读性较差,并且可能会出现错误。

有些语言会评估switch语句语法类似于序列if语句,但 C、C++ 和 C# 不在其中。


在乔恩·斯基特(Jon Skeet)评论说这可能“有趣”之后try为了让它发挥作用”,我将违背我最初的判断并配合,因为确实可以通过尝试替代方案来学习,看看它们在哪里有效,在哪里无效。希望我不会最终把事情搞得比我应该的还要混乱……

所考虑的语言中 switch 语句的目标必须是常量 - 它们不是在运行时计算的表达式。但是,您可能会得到与您正在寻找的行为类似的行为if您可以将想要作为切换目标的条件映射到哈希函数,该函数将生成与条件匹配的完美哈希。如果可以做到这一点,您可以调用哈希函数并打开它生成的值。

当您想要打开字符串值时,C# 编译器会自动为您执行类似的操作。在 C 中,当我想要打开字符串时,我手动执行了类似的操作。我将目标字符串与用于标识字符串的枚举一起放在表中,然后打开枚举:

char* cmdString = "copystuff";  // a string with a command identifier, 
                                //   maybe obtained from console input

StrLookupValueStruct CmdStringTable[] = {
    { "liststuff", CMD_LIST },
    { "docalcs",   CMD_CALC },
    { "copystuff", CMD_COPY },
    { "delete",    CMD_DELETE },
    { NULL,        CMD_UNKNOWN },
};

int cmdId = strLookupValue( cmdString, CmdStringTable); // transform the string 
                                                        //    into an enum

switch (cmdId) {
    case CMD_LIST:
        doList();
        break;

    case CMD_CALC:
        doCalc();
        break;

    case CMD_COPY:
        doCopy();
        break;

    // etc...    
}

而不必使用一系列if声明:

if (strcmp( cmdString, "liststuff") == 0) {
    doList();
}
else if (strcmp( cmdString, "docalcs") == 0)  {
    doCalc();
}
else if (strcmp( cmdString, "copystuff") == 0) {
    doCopy();
}
// etc....

顺便说一句,对于这里的字符串到函数映射,我个人认为表查找/switch 语句组合更具可读性,但我想有些人可能更喜欢更直接的方法if顺序。

您问题中的表达式集看起来并不特别容易转换为散列 - 您的散列函数几乎肯定最终会成为一系列if语句 - 你基本上只是将构造移动到其他地方。乔恩·斯基特 (Jon Skeet) 最初的答案本质上是将你的表达式转换为散列,但是当or操作被放入其中一项测试中,哈希函数崩溃了。

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

c中switch语句中的多个变量 的相关文章

  • 调用许多网络服务的最佳方式?

    我有 30 家子公司 每家都实施了他们的 Web 服务 使用不同的技术 我需要实现一个Web服务来聚合它们 例如 所有子公司的Web服务都有一个名为的Web方法GetUserPoint int nationalCode 我需要实现我的网络服
  • std::list::clear 是否会使 std::list::end 迭代器无效?

    检查这个代码 include stdafx h include
  • C# 和月历,选择多个日期

    我正在制作一个程序 可以帮助人们用 C 为某个部门 预订 订单 他们需要能够选择不同月份的多个日期 我更愿意拥有它 这样他们就可以单击一个日期 然后按住 Shift 键单击另一个日期以选择这两个日期之间的所有日期 并控制单击以进行单选 取消
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • 以下 PLINQ 代码没有改进

    我没有看到使用以下代码的处理速度有任何改进 IEnumerable
  • 如何调试在发布版本中优化的变量

    我用的是VS2010 我的调试版本工作正常 但我的发布版本不断崩溃 因此 在发布版本模式下 我右键单击该项目 选择 调试 然后选择 启动新实例 此时我看到我声明的一个数组 int ma 4 1 2 8 4 永远不会被初始化 关于可能发生的事
  • make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚?

    前几天我偶然看到这个非常有趣的演示 http channel9 msdn com Events GoingNative GoingNative 2012 STL11 Magic Secrets作者 Stephan T Lavavej 其中提
  • Nhibernate:连接表并从其他表获取单列

    我有以下表格 create table Users Id uniqueidentifier primary key InfoId uniqueidentifier not null unique Password nvarchar 255
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • 提升mapped_file_source、对齐方式和页面大小

    我正在尝试在性能很重要的上下文中解析一些大小高达几百兆字节的文本文件 因此我使用 boostmapped file source 解析器期望源以空字节终止 因此我想检查文件大小是否是页面大小的精确倍数 如果是 则使用较慢的非内存映射方法 我
  • 为什么 std::function 不是有效的模板参数,而函数指针却是?

    我已经定义了名为的类模板CallBackAtInit其唯一目的是在初始化时调用函数 构造函数 该函数在模板参数中指定 问题是模板不接受std function作为参数 但它们接受函数指针 为什么 这是我的代码 include
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • 编写具有多种类型的泛型扩展方法时的类型推断问题

    我正在为 IEnumerable 编写一个通用扩展方法 用于将对象列表映射到另一个映射对象列表 这就是我希望该方法的工作方式 IList
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • 不使用放置 new 返回的指针时的 C++ 严格别名

    这可能会导致未定义的行为吗 uint8 t storage 4 We assume storage is properly aligned here int32 t intPtr new void storage int32 t 4 I k
  • MSVC编译器下使用最大成员初始化联合

    我正在尝试初始化一个LARGE INTEGER在 C 库中为 0 确切地说是 C 03 以前 初始化是 static LARGE INTEGER freq 0 在 MinGW 下它产生了一个警告 缺少成员 LARGE INTEGER Hig
  • Emacs C++,打开相应的头文件

    我是 emacs 新手 我想知道 是否有在头文件 源文件和相应的源文件 头文件之间切换的快捷方式 是否有像通用 emacs 参考卡那样的参考卡 Thanks There s ff find other file 您可以使用以下方法将其绑定到

随机推荐