选择很多案例而不是c> ='0'&& c< ='9'到0-9号码检查

时间:2013-05-11 00:01:51

标签: c if-statement switch-statement

以下代码是我正在阅读的解释器的一部分。我想弄清楚为什么要使用这个而不是简单的c >= '0' && c <= '9'

switch(ch) {
  //...
  case '0': case '1': case '2': 
  case '3': case '4': case '5':
  case '6': case '7': case '8':
  case '9': 
  //etc
  break;
  //more cases
}

我也非常好奇为什么选择使用开关。它是一个解释器的代码,我相信作者有一个背景C知道。这是否比c >= '0' && c <= '9'条件最快还是这种方式让编译器进行一些优化?它是使用gcc

编译的

5 个答案:

答案 0 :(得分:3)

您无法在交换机case中使用条件。如果你想使用c >= '0' && c <= '9',那么你必须使用if语句,然后它可能会使检查其他案例变得困难,例如:

if (c >= '0' && c <= '9') {
  // ...
} else if (c == 'a') {
  // ...
} else if (c == 'b') {
  // ...
} else if (c == 'c') {
  // ...
} // more cases

可能不会比

更好
switch(ch) {
  //...
  case '0': case '1': case '2': 
  case '3': case '4': case '5':
  case '6': case '7': case '8':
  case '9': 
  //etc
  break;
  case 'a': //...
  case 'b': //...
  case 'c': //...
  //etc
}

答案 1 :(得分:2)

特别是对于仅的数字,这可以保证产生与等效if相同的结果。

但是,根据“更多情况”部分,使用switch编写代码时可能更容易阅读。例如,如果“更多情况”想要捕获所有小写字母,理论上理论错误就像这样编写测试:

if (c >= 'a' || c <= 'z')

所以你必须这样写:

if (c == 'a' || c == 'b' || ...)

在这种情况下,使用switch比使用if / elseif要容易得多。

答案 2 :(得分:2)

也许

if(isdigit(ch)){
    //etc
} else {
    //more cases
}

答案 3 :(得分:1)

正如@Zack所说,这在很大程度上取决于“更多案例”。当交换机中存在大量情况时,许多编译器将生成条件指令和跳转表的优化组合。这不仅仅是可读性问题。

答案 4 :(得分:0)

如果您使用GCCClang,您也可以写:

switch(ch) {
  //...
  case '0' ... '9': 
  //stuff
  break;
  //more cases
}