2013-02-06 113 views
-1

我整理我的字符串(升序)使用switch-case而不是“if”会好吗?

Sorted string : ! % & * + , -/; <=> ?^| ~ 
33, 37, 38, 42, 43, 44, 45, 47, 59, 60, 61, 62, 63, 94, 124, 126 

这是很多运营商。目前我正在使用if语句。我是否应该为此案申请开关柜?它会影响速度&的性能?哪个更好?

一些例子:

case 47 : 
case 59 : //Does it affect performance? 

在我看来,它应该是:

case 1 : 
case 2 : 
case 3 : 
etc 
+0

这是什么语言?请给出更多的上下文。 –

+0

多个ifs可以被开关替换 – Satya

回答

6

我不会担心性能,而是可读性。
您只能在基本类型上使用switch语句(如int,char,enums等)。
编译器很可能会优化两个决定之间的等价关系,只要它们具有相同的行为。

此外,只是因为字符在ASCII表中表示为整数,并不意味着您应该在字符开关的case语句中使用整数。

char c = '%'; 
    switch(c){ 
     case '!': 
      //... code ... 
      break; 

     case '%': 
      //... code ... 
      break; 

     case '&': 
      //...code ... 
      break; 

     //etc ... 
    } 
6

此之前已经问在计算器上:

而且还对其他论坛:


如果使用的字符执行下列操作

它要求之前,建议Google


感谢Xploit,我一直在提醒,您也可以直接放在char s转换为switch语句,因为所有的一个char是,是一个整数。

case '*':case 42:相比,哪一个更容易阅读?

+0

我使用Google搜索,但找不到正确的答案。这是关于整数和整数。“ – xersi

+0

”switch语句只能用[有序值](https://en.wikipedia.org/wiki/Ordinal_number) - 即整数。因此,如果您想使用具有非整数值的开关,您必须有某种方法将该值转换为整数。“ - [CPlusPlus.com](http://www.cplusplus.com/faq/sequences/strings/switch-on-string/)。所以没关系,与开关有关的任何事情仍然是关于整数。 – question

1

你也可以实现使用一个表,在升级软件时,这可能是更少的工作:

typedef void (*Ptr_Processing_Function)(char token); 

struct Table_Entry 
{ 
    char      token_char; 
    Ptr_Processing_Function process_token; 
}; 


static const Table_Entry operators_table[] = 
{ 
    {'+', Process_Plus_Operator}, 
    {'-', Process_Minus_Operator}, 
    //... 
}; 
static const unsigned int OPERATOR_QUANTITY = 
    sizeof(operators_table)/sizeof(operators_table[0]); 

void Process_Token(char token) 
{ 
    bool token_found = false; 
    for (unsigned int i = 0; i < OPERATOR_QUANTITY; ++i) 
    { 
     if (token == operators_table[i].token_char) 
     { 
      if (operators_table[i].process_token != NULL) 
      { 
       process_token(token); 
       token_found = true; 
       break; 
      } 
     } 
    } 
} 

异常情况作为练习留给读者。

相关问题