在char中分配多个字符

为什么这个程序输出'y'

 #include  int main(void) { char ch='abcdefghijklmnopqrstuvwxy'; printf("%c",ch); return 0; } 

代码在ideone

这是一个多字符文字。

包含多个c-char的普通字符文字是多字符文字。 多字符文字具有int类型和implementation-de fi ned值

同样来自C11规格中的6.4.4.4/10

整数字符常量的类型为int。 包含映射到单字节执行字符的单个字符的整数字符常量的值是解释为整数的映射字符的表示的数值。 包含多个字符(例如, ‘ab’ )的整数字符常量的值,或包含未映射到单字节执行字符的字符或转义序列的值是实现定义的 。 如果整数字符常量包含单个字符或转义序列,则其值是当char为char的类型为单个字符或转义序列的对象转换为int类型时生成的值。

所以你的系统上的行char ch = 'abcdefghijklmnopqrstuvwxy' (假设4字节为int)可能编译为:

 char ch = 0x76777879; // SOME int value (may be different, but documented in the compiler documents) 

ch将被赋予'abcdef...y' ,它可能等同于 (int)0x616263646566...79在ascii编码中并溢出一个整数。 这就是gcc生成以下警告的原因:

multicharlit.c:在函数’main’中:
multicharlit.c:4:13:警告:字符常量太长,类型[默认启用]
multicharlit.c:4:5:警告:隐式常量转换溢出[-Woverflow]

它出现在您的系统上,最低有效8位用于分配给ch 。 因为你的字符文字是常量,所以这很可能发生在编译时:(例如,当我用gcc编译时会发生以下情况)

 $ cat multicharlit.c #include  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 () { : __builtin_putchar (121); return 0; } 

从放松的评论中窃取一些善意

请记住,单引号字符常量的类型是int ,但是您将它分配给char ,因此必须将其截断为单个字符。

例如, 'a'类型在Cint 。 (不要与C++ 'a'混淆,这是一个char。另一方面, 'ab'类型在CC++都是 int 。)

现在,当您将此int类型分配给char类型并且值大于可以由char表示时,则需要进行一些挤压以使结果适合更小的类型char ,并且实际结果是实现定义的。

如果你打算打印出abcdefghijklmnopqrstuvwxy ,那么你应该把它存储到一个字符串变量而不是一个char变量中(char ch [50] = char abcdefghijklmnopqrstuvwxy;)。

字符串变量可以包含多个字符 ,其中char变量用于保存一个字符。