char val ='abcd'.使用多字符char

mad*_*adu 6 c++ char

我对编译器如何处理具有多个字符的char变量感到困惑.我知道char是1个字节,它可以包含一个像ASCII这样的字符.

但是当我尝试:

char _val = 'ab';
char _val = 'abc';
char _val = 'abcd';
Run Code Online (Sandbox Code Playgroud)

它们编译得很好,当我打印_val时,它总是打印出最后一个字符.但是当我这样做的时候

char _val = 'abcde';
Run Code Online (Sandbox Code Playgroud)

然后我收到编译错误:

错误1错误C2015:常量中的字符太多

所以我的问题是:

  1. 为什么编译器总是在使用多个字符时使用最后一个字符?在这种情况下编译器机制是什么.
  2. 当我输入5个字符时,为什么会出现太多字符错误.2个字符比char可以处理的更多,为什么5?

我正在使用Visual Studio 2013.

谢谢.

Col*_*mbo 9

[lex.ccon]/1:

包含多个c-char的普通字符文字是 多字符文字.多字符文字[..] 是有条件支持的,具有类型int,并具有实现定义的值.


为什么编译器总是在使用多个字符时使用最后一个字符?在这种情况下编译器机制是什么.

大多数编译器只是将字符值按顺序移动到一起:这样,最后一个字符占据最低有效字节,倒数第二个字符占据最低有效字符旁边的字节,依此类推.
'abc'等同于'c' + ((int)'b')<<8) + (((int)'a')<<16)(演示).

将它转换int回a char将具有一个实现定义的值 - 这可能只是从int模256 的值中得出.这只会给你最后一个字符.

当我输入5个字符时,为什么会出现太多字符错误.2个字符比char可以处理的更多,为什么5?

因为在你的机器int上大概有四个字节.如果以上确实是编译器排列多字符常量的方式,则不能将五个char值放入int.