在 char 中分配多个字符

问题描述 投票:0回答:3

为什么这个程序给出输出

'y'

#include <stdio.h>

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

ideone 的代码

c char
3个回答
14
投票

这是一个多字符文字。

包含多个 c 字符的普通字符文字是 多字符文字。多字符文字的类型为 int 且 实现定义的值

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

整型字符常量的类型为 int。整数的值 包含映射到的单个字符的字符常量 单字节执行字符是数值 解释为整数的映射字符的表示形式。这 包含多个的整型字符常量的值 字符(例如,'ab'),或包含字符或转义序列 不映射到单字节执行字符的是 实现定义。如果整型字符常量包含 单个字符或转义序列,其值是结果 当一个 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'
,其中 可能相当于 ASCII 编码中的 (int)0x616263646566...79
 并溢出整数。这就是 
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; }


还从

unwind的评论中窃取了一些优点

记住单引号字符常量的类型是

int

,
  但你将它分配给 
char
,所以它必须被截断为
  单个字符。

例如

'a'

的类型是
int
中的
C
。 (不要与 
'a'
 中的 
C++
 混淆,它是一个字符。另一方面,
'ab'
 的类型是 
 
intC
 中的 
C++
。)

现在,当您将此

int

 类型分配给 
char
 类型并且值大于 
char
 可以表示的值时,则需要进行一些压缩以使结果适合更宽的类型 
char
 并实际结果是实现定义的。


0
投票
如果您打算打印出

abcdefghijklmnopqrstuvwxy,那么您应该将其存储到字符串变量而不是字符变量中(char ch[50] = char abcdefghijklmnopqrstuvwxy;)。

字符串变量可以容纳

多个字符,而字符变量则用于容纳一个字符。


0
投票
我不明白如何在 C 中创建多变量文字而不出现错误。

© www.soinside.com 2019 - 2024. All rights reserved.