无法理解以下代码中发生的事情
wchar_t wc;
wc =L'ab';
char ch = 'ab';
当我调试上面的代码时,我发现a存储在wc
中b
存储在ch
中。
我不明白为什么a
没有存储在ch
。
答案 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“截断常数值”。