混淆了与character和wchar_t相关的输出

时间:2012-11-22 09:05:30

标签: c++

无法理解以下代码中发生的事情

wchar_t wc;

wc =L'ab';

char ch = 'ab'; 

当我调试上面的代码时,我发现a存储在wcb存储在ch中。 我不明白为什么a没有存储在ch

4 个答案:

答案 0 :(得分:5)

6.4.4.4规范第10段:

  

包含多个的整数字符常量的值   字符(例如,'ab'),或包含字符或转义序列   如果没有映射到单字节执行字符,是实现定义的

换句话说,不同的编译器可能会以不同的方式做事。

答案 1 :(得分:1)

来自标准:

  

多字符文字具有int类型和实现定义的值。

所以你用一个(实现定义的)int初始化char ch,然后把它变成一个char。这个字母恰好是'b'。

如果编译器也在这里发出警告,我也不会感到惊讶,尤其是使用-Wall编译器标志或类似标记。

答案 2 :(得分:1)

这是编译器定义的行为:

在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]

答案 3 :(得分:1)

首先,您不应该为这些单个字符变量赋予两个字符。这根本不正确。

然后,当我尝试通过VC2010编译您的代码时,我收到了“wc = L'ab';”行的警告消息C4066,并获得了“char ch ='ab'行的警告消息C4305和C4309 ;”

C4066告诉我们第二个字符被忽略了。这是因为编译器将L'ab'的类型视为字符。但是对于下一行,编译器将'ab'视为整数值,而不是两个字符。所以我收到警告信息C4305“从int截断到char”和C4309“截断常数值”。