以下代码是我正在阅读的解释器的一部分。我想弄清楚为什么要使用这个而不是简单的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
答案 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)
如果您使用GCC
或Clang
,您也可以写:
switch(ch) {
//...
case '0' ... '9':
//stuff
break;
//more cases
}