0

以下代码是我正在阅读的解释器的一部分。我试图弄清楚为什么确切地使用它而不是简单的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 编译的

4

5 回答 5

3

您不能在 switch 中使用条件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
}
于 2013-05-11T00:03:56.270 回答
2

针对数字,这保证产生与等效结果相同的结果if

但是,根据“更多情况”部分,使用switch. 例如,如果“更多案例”想要捕获所有小写字母,那么这样编写测试在理论上是错误的:

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

所以你必须这样写:

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

switch在这种情况下,它比if/更容易使用elseif

于 2013-05-11T00:05:51.263 回答
2

也许

if(isdigit(ch)){
    //etc
} else {
    //more cases
}
于 2013-05-11T00:09:38.980 回答
1

正如@Zack 提到的,这在很大程度上取决于“更多案例”是什么。很多编译器会在切换的情况很多时生成条件指令和跳转表的优化组合。这不一定只是可读性的问题。

于 2013-05-11T02:48:36.250 回答
0

如果你使用GCC或者Clang你也可以写:

switch(ch) {
  //...
  case '0' ... '9': 
  //stuff
  break;
  //more cases
}
于 2014-03-18T18:49:36.963 回答