Не в состоянии понять, что происходит в приведенном ниже коде
wchar_t wc;
wc =L'ab';
char ch = 'ab';
Когда я отлаживаю приведенный выше код, я обнаружил, что в wc
в то время как b
хранится в ch
,
Я не понимаю почему a
не хранится внутри ch
,
Это поведение, определяемое компилятором:
На 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]
6.4.4.4 пункт 10 спецификации:
Значение целочисленной символьной константы, содержащей более одного
символ (например, «ab») или содержащий символ или escape-последовательность
это не отображается на однобайтовый символ выполнения, определяется реализацией
Другими словами, другой компилятор может действовать по-другому.
Из стандарта:
Многозначный литерал имеет тип int и от реализации значение.
Итак, вы инициализируете символ ch
с (определенной реализацией) int, который, в свою очередь, превращается в символ. Этот символ, случается, «б».
Меня не удивит, если компилятор выдаст здесь предупреждение, особенно. с -Wall
флаг компилятора или аналогичный.
Во-первых, вам не следует присваивать два символа этим односимвольным переменным. Это неверно на всех.
Затем, когда я попытался скомпилировать ваш код с помощью моего VC2010, я получил предупреждающее сообщение C4066 для строки «wc = L’ab ‘;» и получил предупреждающие сообщения C4305 и C4309 для строки «char ch =’ ab ‘;».
C4066 говорит нам, что второй персонаж был проигнорирован. Это потому, что компилятор рассматривает тип L’ab ‘как символ. Но для следующей строки компилятор рассматривает ‘ab’ как целочисленное значение, а не два символа. Поэтому я получил предупреждающие сообщения C4305 «усечение от типа int до символа» и C4309 «усечение постоянного значения».