Путать с выводом, связанным с символом и wchar_t

Не в состоянии понять, что происходит в приведенном ниже коде

wchar_t wc;

wc =L'ab';

char ch = 'ab';

Когда я отлаживаю приведенный выше код, я обнаружил, что в wc в то время как b хранится в ch ,
Я не понимаю почему a не хранится внутри ch,

2

Решение

Это поведение, определяемое компилятором:

На 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

Другие решения

6.4.4.4 пункт 10 спецификации:

Значение целочисленной символьной константы, содержащей более одного
символ (например, «ab») или содержащий символ или escape-последовательность
это не отображается на однобайтовый символ выполнения, определяется реализацией

Другими словами, другой компилятор может действовать по-другому.

5

Из стандарта:

Многозначный литерал имеет тип int и от реализации значение.

Итак, вы инициализируете символ ch с (определенной реализацией) int, который, в свою очередь, превращается в символ. Этот символ, случается, «б».

Меня не удивит, если компилятор выдаст здесь предупреждение, особенно. с -Wall флаг компилятора или аналогичный.

1

Во-первых, вам не следует присваивать два символа этим односимвольным переменным. Это неверно на всех.

Затем, когда я попытался скомпилировать ваш код с помощью моего VC2010, я получил предупреждающее сообщение C4066 для строки «wc = L’ab ‘;» и получил предупреждающие сообщения C4305 и C4309 для строки «char ch =’ ab ‘;».

C4066 говорит нам, что второй персонаж был проигнорирован. Это потому, что компилятор рассматривает тип L’ab ‘как символ. Но для следующей строки компилятор рассматривает ‘ab’ как целочисленное значение, а не два символа. Поэтому я получил предупреждающие сообщения C4305 «усечение от типа int до символа» и C4309 «усечение постоянного значения».

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector