20

C ++実装では、文字「0」〜「9」を連続した数値を持つように設定する必要があります。つまり、次のようになります。

'0' -> 0+n
'1' -> 1+n
 m  -> m+n
'9' -> 9+n

isdigit([classification](22.3.3.1 Character Classification))*のドキュメントに記載されているものが見つかりません。また、ロケールのドキュメントにもありません(ただし、十分に調べていなかった可能性があります)。

2.3文字セットでは、

基本的なソース文字セットは、スペース文字、水平タブ、垂直タブ、フォームフィード、改行を表す制御文字、および次の91個のグラフィック文字の96文字で構成されます。

しかし、それは順序については言及していません(しかし、多分私は十分に一生懸命に見えませんでした)。


*:興味深い脚注があります:

ループで使用する場合は、ctype <>ファセットをキャッシュして直接使用するか(isdigit()et al、end commentの代わりに)、またはctype <>::isのベクトル形式を使用する方が高速です。

4

1 に答える 1

23

確かに十分に見えませんでした: 2.3 で。文字セット、項目 3:

ソースと実行の両方の基本文字セットで、上記の 10 進数のリストの0 の後の各文字の値は、前の の値よりも1 大きくなります。

そして、これは10進数のリストの上にあります:

0 1 2 3 4 5 6 7 8 9

したがって、実装では、10 進数が連続して表現される文字セットを使用する必要があります。したがって、このプロパティに依存する最適化は安全です。ただし、他の数字の連続性 (たとえば 'a'..'z') に依存する最適化は、標準に対して移植性がありません( header も参照してください<cctype>)。これを行う場合は、必ずそのプロパティをアサートしてください。

于 2012-02-23T16:22:00.007 に答える