以下のコードで何が起こっているのか理解できません
wchar_t wc;
wc =L'ab';
char ch = 'ab';
上記のコードをデバッグしているときに、 asが に格納されてwc
いる場所にa が格納されていることがわかりました。が内部に保存されていない理由がわかりません。b
ch
a
ch
以下のコードで何が起こっているのか理解できません
wchar_t wc;
wc =L'ab';
char ch = 'ab';
上記のコードをデバッグしているときに、 asが に格納されてwc
いる場所にa が格納されていることがわかりました。が内部に保存されていない理由がわかりません。b
ch
a
ch
仕様の6.4.4.4パラ10:
複数の文字 ('ab' など) を含む整数文字定数の値、またはシングルバイト実行文字にマップされない文字またはエスケープ シーケンスを含む整数文字定数の値は、処理系定義です。
言い換えれば、別のコンパイラは別の方法で処理を行う可能性があります。
標準から:
複数文字リテラルには、int型と実装定義値があります。
したがって、charch
を(実装が定義された)intで初期化し、intをcharに変換します。その文字はたまたま「b」です。
コンパイラがここでも警告を発したとしても、私は驚かないでしょう。-Wall
コンパイラフラグなどを使用します。
これはコンパイラ定義の動作です。
VS2012では'a'
、'b'
出力を取得します
gcc 4.7.2では'b'
、'b'
出力が表示され、コンパイルすると警告が表示されます。
warning: character constant too long for its type [enabled by default]
warning: multi-character character constant [-Wmultichar]
warning: overflow in implicit constant conversion [-Woverflow]
最初は、これらの 1 文字の変数に 2 つの文字を代入するべきではありません。それはまったく間違っています。
次に、VC2010 でコードをコンパイルしようとすると、「wc = L'ab';」行の警告メッセージ C4066 が表示され、「char ch = 'ab';」行の警告メッセージ C4305 および C4309 が表示されました。
C4066 は、2 番目の文字が無視されたことを示しています。これは、コンパイラが L'ab' の型を文字と見なすためです。しかし、次の行では、コンパイラは 'ab' を 2 文字ではなく整数値と見なします。そのため、C4305「intからcharへの切り捨て」およびC4309「定数値の切り捨て」という警告メッセージが表示されました。