ここで開始された議論から来て、標準は文字の値を指定しますか? それで、'0'
48であることが保証されていますか?それはASCIIが私たちに教えてくれることですが、それは保証されていますか? そうでない場合、'0'
48 以外のコンパイラを見たことがありますか?
4 に答える
いいえ。ソース文字セットまたは実行文字セットで ASCII サブセットのエンコードを使用する必要はありません。非 ASCII の実装は見たことがありませんが、持っている人を知っている人は知っています。(「0」~「9」は連続した整数値である必要がありますが、これは SO の別の場所で重複した質問です。)
ソース文字セットに使用されるエンコーディングは、ソース コードのバイトが C++ 言語で使用される文字にどのように解釈されるかを制御します。標準では、実行文字セットのメンバーは値を持つものとして説明されています。の整数値を決定するのは、これらの文字を対応する値にマップするエンコーディングです'0'
。
少なくとも基本ソース文字セットのすべてのメンバーに加えて、いくつかの制御文字と値ゼロのヌル文字が (適切な値で) 実行文字セットに存在する必要がありますが、エンコーディングが ASCII である必要はありません。文字の特定のサブセット (ヌル文字以外) には ASCII 値を使用します。
いいえ、標準では、ソース文字エンコーディングを指定しないように細心の注意を払っています。
C および C++ コンパイラも EBCDIC コンピュータで実行されます'0' != 0x30
。
しかし、私はそれが必要であると信じてい'1' == '0' + 1
ます。
それ0xF0
はEBCDICにあります。私は EBCDIC コンパイラーを使ったことはありませんが、IBM ではしばらくの間、EBCDIC コンパイラーが大流行していたと言われています。
ソースまたは実行エンコーディングが ASCII ベースであるという C++ 標準の要件はありません。それが保証されてい'0' == '1' - 1
ます(そして、一般に、数字が連続して順番に並んでいることが保証されています)。文字が連続しているとは限りません。実際、EBCDIC'J' != 'I' + 1
と'S' != 'R' + 1
.
C++11標準N3225によると
基本ソース文字セットのメンバーのグリフは、ASCII 文字セットに対応する ISO/IEC 10646 のサブセットから文字を識別することを目的としています。ただし、ソース ファイルの文字からソースの文字セットへのマッピング (変換フェーズ 1 で説明) は実装定義として指定されているため、基本的なソース文字がソース ファイルでどのように表現されるかを文書化する実装が必要です。
要するに、別の実装について聞いたことがありませんが、文字セットを ASCII テーブルにマップする必要はありません。