无法理解以下代码中发生的事情
wchar_t wc;
wc =L'ab';
char ch = 'ab';
当我调试上面的代码时,我发现 a 存储在wc
asb
存储的位置ch
。我不明白为什么a
没有存储在ch
.
无法理解以下代码中发生的事情
wchar_t wc;
wc =L'ab';
char ch = 'ab';
当我调试上面的代码时,我发现 a 存储在wc
asb
存储的位置ch
。我不明白为什么a
没有存储在ch
.
6.4.4.4 规范第 10 段:
包含多个字符(例如,'ab')或包含不映射到单字节执行字符的字符或转义序列的整数字符常量的值是实现定义的
换句话说,不同的编译器可能会做不同的事情。
从标准:
多字符文字具有 int 类型和实现定义的值。
因此,您使用(实现定义的)int 初始化 char ch
,然后将其转换为 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]
首先,您不应该将两个字符添加到这些单字符变量中。这根本不正确。
然后,当我尝试通过我的 VC2010 编译您的代码时,我收到了行“wc = L'ab';”的警告消息 C4066,并收到行“char ch = 'ab';”的警告消息 C4305 和 C4309。
C4066 告诉我们第二个字符被忽略了。这是因为编译器将 L'ab' 的类型视为字符。但是对于下一行,编译器将 'ab' 视为一个整数值,而不是两个字符。所以我收到警告消息 C4305“从 int 截断到 char”和 C4309“截断常量值”。