web-dev-qa-db-ja.com

このCコードでアルファベットが複数の範囲に分割されているのはなぜですか?

カスタムライブラリで実装を見ました:

inline int is_upper_alpha(char chValue)
{
    if (((chValue >= 'A') && (chValue <= 'I')) ||
        ((chValue >= 'J') && (chValue <= 'R')) ||
        ((chValue >= 'S') && (chValue <= 'Z')))
        return 1;
    return 0;
}

それは イースターエッグ ですか、それとも標準のC/C++メソッドに対する利点は何ですか?

inline int is_upper_alpha(char chValue)
{
    return ((chValue >= 'A') && (chValue <= 'Z'));
}
161
Vladimir Ch.

このコードの作成者は、おそらく、ある時点で [〜#〜] ebcdic [〜#〜] をサポートする必要がありました。文字の数値は非連続です(IJおよびRS(ご想像のとおり)。

CおよびC++標準では、文字0から9はまさにこの理由で連続した数値を持っているため、これらの方法はどちらも厳密に標準に準拠していません。

214
Wintermute

EBCDICとASCIIの両方をカバーしようとしているようです。あなたの代替方法はEBCDICでは機能しません(誤検知はありますが、誤検知はありません)

CおよびC++ do'0'-'9'は連続しています。

標準ライブラリの呼び出しdoは、それらがASCII、EBCDIC、または他のシステムで実行されるかどうかを知っているため、より移植性が高く、おそらくより効率的であることに注意してください。

54
MSalters