なぜchar変数は「a」ではなく「ab」の割り当てから「b」を取得するのですか?
char c = 'ab';
printf("c: %c\n", c);
プリント:
c: b
標準によると、それは実装定義です。6.4.4.4文字定数から:
整数文字定数の型は int です。1 バイト実行文字にマップされる単一の文字を含む整数文字定数の値は、整数として解釈されるマップされた文字の表現の数値です。 複数の文字 ('ab' など) を含む整数文字定数の値、またはシングルバイト実行文字にマップされない文字またはエスケープ シーケンスを含む整数文字定数の値は、処理系定義です。
これは、以前の回答がすでに述べているように定義された実装です。
私のgccは「ab」をintとして扱います。次のコード:
printf( "sizeof('ab') = %zu \n", sizeof('ab') );
printf( "'ab' = 0x%08x \n", 'ab' );
printf( "'abc' = 0x%08x \n", 'abc' );
プリント:
sizeof('ab') = 4
'ab' = 0x00006162
'abc' = 0x00616263
あなたのコードでは、次の行:
char c = 'ab';
次のように考えられます。
char c = (char)(0x00006162 & 0xFF);
したがって、c は「ab」の最後の文字の値を取得します。この場合、'b' (0x62) です。
整数の複数文字定数の値は、C11 標準 ( §6.4.4.4 "Character constants" al10 p69 ) に従って実装定義です。
10 - [...] 複数の文字 (「ab」など) を含む整数文字定数の値、またはシングルバイト実行文字にマップされない文字またはエスケープ シーケンスを含む整数文字定数の値は、処理系定義です。 . [...]
'ab'
タイプがint
あり、 achar
は 1 バイトしか保持できないためです。
後の編集:私の答えは、これが実装固有の動作であることをかなり明確に述べた前のものを補完するものでした。私は、コンパイラが「a」ではなく「b」を選択した理由を念頭に置いて、OPが知りたいという印象を受けました。私の答えが紛らわしかったら申し訳ありません。
エンディアン。そのため、「a」ではなく「b」が得られます。それがあなたのマシンのメモリでどのように表現されるかのためです。そして、あなたのマシンはおそらくリトルエンディアンです。
sparc、mipsbe、または腕で試してみると、「b」ではなく「a」が得られる場合があります。
いずれにせよ、実際の製品コードでこれに依存していないことを願っています。