标签: switch-statement

你会如何尽可能快地制作这个切换声明?

2009-12-04更新:有关在此处发布的一些建议的分析结果,请参阅下文!


问题

考虑以下非常无害,非常简单的方法,它使用switch语句返回定义的枚举值:

public static MarketDataExchange GetMarketDataExchange(string ActivCode) {
    if (ActivCode == null) return MarketDataExchange.NONE;

    switch (ActivCode) {
        case "": return MarketDataExchange.NBBO;
        case "A": return MarketDataExchange.AMEX;
        case "B": return MarketDataExchange.BSE;
        case "BT": return MarketDataExchange.BATS;
        case "C": return MarketDataExchange.NSE;
        case "MW": return MarketDataExchange.CHX;
        case "N": return MarketDataExchange.NYSE;
        case "PA": return MarketDataExchange.ARCA;
        case "Q": return MarketDataExchange.NASDAQ;
        case "QD": return MarketDataExchange.NASDAQ_ADF;
        case "W": return MarketDataExchange.CBOE;
        case "X": return MarketDataExchange.PHLX;
        case "Y": return MarketDataExchange.DIRECTEDGE;
    }

    return MarketDataExchange.NONE;
}
Run Code Online (Sandbox Code Playgroud)

我和我的同事今天就如何更快地实现这个方法的几个想法进行了斗争,并且我们想出了一些有趣的修改,实际上相当显着地提高了它的性能(当然,按比例说).我有兴趣知道那里的其他人可以想到哪种优化可能没有发生在我们身上.

接下来,让我简单地提供一个快速免责声明:这是为了好玩 …

c# optimization switch-statement

33
推荐指数
6
解决办法
4531
查看次数

切换枚举时在switch语句中使用default

切换枚举时,您的程序是什么?每个枚举都包含在案例中?理想情况下,您希望代码能够成为未来的证明,您是如何做到的?

另外,如果一些白痴向枚举类型转换了一个任意的int呢?是否应该考虑这种可能性?或者我们是否应该假设在代码审查中会发现这样一个令人震惊的错误?

enum Enum
{
    Enum_One,
    Enum_Two
};

Special make_special( Enum e )
{
    switch( e )
    {
        case Enum_One:
            return Special( /*stuff one*/ );

        case Enum_Two:
            return Special( /*stuff two*/ );
    }
}

void do_enum( Enum e )
{
    switch( e )
    {
        case Enum_One:
            do_one();
            break;

        case Enum_Two:
            do_two();
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 离开默认情况,gcc会警告你(视觉工作室会吗?)
  • 添加一个默认情况assert(false);
  • 添加一个抛出可捕获异常的默认情况
  • 添加一个抛出不可捕获异常的默认情况(可能只是策略从不捕获它或总是重新抛出).
  • 我没有考虑过的更好的东西

我特别感兴趣的是你为什么选择这样做.

c++ enums switch-statement

33
推荐指数
4
解决办法
1万
查看次数

在Windows批处理文件中切换语句等效

我想知道是否有一种简单的方法可以在Windows批处理文件中执行分支,具体取决于单个表达式的值.类似于C,C++,C#,Java,JavaScript,PHP和其他真实编程语言中的switch/case块的东西.

我唯一的解决方法是一个简单的if/else块,其中重复检查相同的表达式是否与不同的值相等:

IF "%ID%"=="0" (
  REM do something
) ELSE IF "%ID%"=="1" (
  REM do something else
) ELSE IF "%ID%"=="2" (
  REM do another thing
) ELSE (
  REM default case...
)
Run Code Online (Sandbox Code Playgroud)

如此愚蠢.有更好的解决方案吗?

batch-file switch-statement

33
推荐指数
4
解决办法
12万
查看次数

为什么Python没有switch-case?

我是Python的新手.请解释为什么python没有switch-case?

python switch-statement

33
推荐指数
4
解决办法
3万
查看次数

切换语句不好?

我最近了解到开关语句在OOP中很糟糕,特别是罗伯特·马丁的"清洁代码"(第37-39页).

但请考虑这个场景:我正在编写一个游戏服务器,接收来自客户端的消息,其中包含一个表示玩家行为的整数,例如移动,攻击,挑选项目......等等,将有超过30种不同的动作.当我编写代码来处理这些消息时,没有想到我想到的解决方案,它将不得不在某处使用switch.如果不切换语句,我应该使用什么模式?

oop design-patterns coding-style switch-statement

32
推荐指数
5
解决办法
4万
查看次数

是否可以使用goto与开关?

看来它可以用C#,但我需要用C++,最好是跨平台.

基本上,我有一个开关,可以根据单个条件对内容进行排序,并在其他所有内容上回退到默认处理.

说:

switch(color)
{
case GREEN:
case RED:
case BLUE:
    Paint();
    break;
case YELLOW:
    if(AlsoHasCriteriaX)
        Paint();
    else
        goto default;
    break;
default:
    Print("Ugly color, no paint.")
    break;
}
Run Code Online (Sandbox Code Playgroud)

c++ goto switch-statement

32
推荐指数
2
解决办法
2万
查看次数

状态机的C++代码

这是一个用C++编写的面试问题:

编写自动售货机的代码:从一个简单的代码开始,它只是出售一种类型的商品.所以两个状态变量:金钱和库存,都可以.

我的答案:

我会使用一个有3-4种状态的状态机.使用枚举变量来指示状态并使用switch case语句,其中每个case都有对应于每个状态的操作,并保持循环以从一个状态移动到另一个状态.

下一个问题:

但是,对于添加的更多状态和修改状态中的现有操作,使用switch case语句不能"很好地扩展".你打算如何处理这个问题?

我当时无法回答这个问题.但后来想到,我可能:

  • 具有不同状态的不同功能(每个功能对应一个状态)
  • 有一个std::mapfrom(string,function),其中string表示调用相应状态函数的状态.
  • main函数有一个字符串变量(从初始状态开始),并在循环中调用与该变量对应的函数.每个函数都执行所需的操作,并将新状态返回给main函数.

我的问题是:

  • 在大规模软件系统环境中,关于可伸缩性的switch-case语句有什么问题?
  • 如果是这样,我的解决方案(目前我觉得比使用长线性代码更模块化)将解决问题?

面试问题是期待C++习语的答案和大型软件系统的设计模式.

c++ design-patterns idioms state-machine switch-statement

32
推荐指数
4
解决办法
7万
查看次数

使用String的Java 7 switch语句是否使用equals()方法?

Java 7支持切换,Strings如下面的代码

switch (month.toLowerCase()) {
case "january":
    monthNumber = 1;
    break;
case "february":
    monthNumber = 2;
    break;
default: 
    monthNumber = 0;
    break;
}
Run Code Online (Sandbox Code Playgroud)

Java是否equals()在每种String情况下调用该方法?或者,它依赖于==intern()

这简单地等同于:

String month = month.toLowerCase();
if("january".equals(month)){
monthNumber = 1;
}else if("february".equals(month)){
monthNumber = 1;
}..
Run Code Online (Sandbox Code Playgroud)

更新:

将switch表达式中的String与每个case标签关联的表达式进行比较,就好像String.equals正在使用该方法一样.

正如文档所指出的那样,行为就像equals()被调用一样.

java string equals switch-statement

32
推荐指数
4
解决办法
2万
查看次数

什么是大型开关盒的良好替代品?

我有一个名为Country的对象.在程序的某个时刻,我想设置每个对象的场强.

每个国家的权力是固定的,我在一张纸上有所有196个国家的数据.例如,我的代码应该检查国家/地区的名称是否为USA(如果是,则将其功率设置为100),依此类推.

我知道我可以用开关盒做到这一点,但是最好,最好,最有效的方法是什么?

c# case switch-statement

31
推荐指数
3
解决办法
3616
查看次数

海湾合作委员会第7号, - 明显的通过警告,以及清除它们的便携方式?

我们正在接受GCC 7的警告,因为它在switch语句中是隐含的.以前,我们在Clang下清除它们(这是下面评论的原因):

g++ -DNDEBUG -g2 -O3 -std=c++17 -Wall -Wextra -fPIC -c authenc.cpp
asn.cpp: In member function ‘void EncodedObjectFilter::Put(const byte*, size_t)’:
asn.cpp:359:18: warning: this statement may fall through [-Wimplicit-fallthrough=]
    m_state = BODY;  // fall through
                  ^
asn.cpp:361:3: note: here
   case BODY:
   ^~~~
Run Code Online (Sandbox Code Playgroud)

GCC手册状态使用__attribute__ ((fallthrough)),但它不便于携带.该手册还指出"...也可以添加一个通过注释来消除警告",但它只提供FALLTHRU(这真的是唯一的选择吗?):

switch (cond)
  {
  case 1:
    bar (0);
    /* FALLTHRU */
  default:
    …
  }
Run Code Online (Sandbox Code Playgroud)

对于Clang和GCC,是否有通过警告来清除坠落的便携方法?如果是的话那么它是什么?

c++ gcc warnings switch-statement

31
推荐指数
2
解决办法
1万
查看次数