这是一个多字符文字。
包含多个 c 字符的普通字符文字是
多字符文字。多字符文字的类型为 int 且实现定义的值.
也来自 C11 规范中的 6.4.4.4/10
整型字符常量的类型为 int。整数的值
包含映射到的单个字符的字符常量
单字节执行字符是数值
解释为整数的映射字符的表示形式。这
包含多个的整型字符常量的值
字符(例如,'ab'),或包含字符或转义序列
不映射到单字节执行字符, is
实现定义的。如果整型字符常量包含
单个字符或转义序列,其值是结果
当一个 char 类型的对象的值是 single 的时候
字符或转义序列转换为 int 类型。
所以这条线char ch = 'abcdefghijklmnopqrstuvwxy'
在您的系统上(假设 4 字节 int)可能会编译为:
char ch = 0x76777879; // SOME int value (may be different, but documented in the compiler documents)
ch
将被分配'abcdef...y'
which may be相当于 http://ideone.com/SfhNNO (int)0x616263646566...79
以 ascii 编码并溢出整数。这就是为什么gcc
生成以下警告:
multicharlit.c:在函数“main”中:
multicharlit.c:4:13:警告:
字符常量对于其类型来说太长[默认启用]
multicharlit.c:4:5:警告:隐式常量转换中溢出
[-Woverflow]
在您的系统上显示,最低有效 8 位用于分配ch
。因为您的字符文字是恒定的,所以这很可能在编译时发生:(例如,当我使用以下命令进行编译时,会发生以下情况gcc
)
$ cat multicharlit.c
#include <stdio.h>
int main(void) {
char ch='abcdefghijklmnopqrstuvwxy';
printf("%c",ch);
return 0;
}
$ gcc -O2 -fdump-tree-optimized multicharlit.c
$ cat multicharlit.c.143t.optimized
;; Function main (main) (executed once)
main ()
{
<bb 2>:
__builtin_putchar (121);
return 0;
}
也偷走了一些美好放松的评论 https://stackoverflow.com/questions/31335472/assigning-more-than-one-character-in-char#comment50655643_31335472
请记住,单引号字符常量的类型是int
,
但你把它分配给char
,所以它必须被截断为
单个字符。
Type of 'a'
例如是int
in C
。 (不要与'a'
in C++
这是一个字符。另一方面类型'ab'
is int
in both C
and C++
.)
现在当你分配这个int
键入一个char
类型和值超出了可以表示的范围char
,然后需要进行一些压缩以使结果适合不太宽的类型char
实际结果是实现定义的。