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(isdigit(ch)){
    //etc
} else {
    //more cases
}
于 2013-05-11T00:09:38.980 に答える
2

特に数字のみの場合、これは同等のものと同じ結果を生成することが保証されていifます。

ただし、「より多くの場合」の部分によっては、 を使用して記述した方がコードが読みやすい場合がありますswitch。たとえば、「より多くのケース」がすべての小文字をキャッチしたい場合、次のようにテストを書くことは理論的に間違っています:

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

したがって、次のように記述する必要があります。

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

この場合、/switchよりもはるかに使いやすいです。ifelseif

于 2013-05-11T00:05:51.263 に答える
0

使用する場合、GCCまたはClang書くこともできます:

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