我的程序中有以下代码:
char ch='abcd';
printf("%c",ch);
输出为d。
我无法理解为什么char变量允许在其声明中接受4个字符而不会产生编译时错误。
注意:超过4个字符会出错。
答案 0 :(得分:6)
'abcd'
被称为多字符常量,并且将具有实现定义的值,此处编译器会为您提供“d”。
如果您使用gcc并使用-Wmultichar
或-Wall
编译代码,gcc会向您发出警告。
答案 1 :(得分:0)
假设您知道您正在使用多字符常量,以及它是什么。
这些天我不使用VS,但我的看法是,4-char多字符包含在int
中,然后下载到char
。这就是允许的原因。由于多字符常量到整数类型的打包顺序是编译器定义的,它的行为就像你观察它一样。
因为多字符常量用于填充整数类型,所以可以尝试使用8字节长的多字符。我不确定VS编译器是否支持它,但它很有可能,因为它适合64位long
类型。
它可能应该发出一个警告,试图为这个类型设置一个太大的文字值。这有点像unsigned char leet = 1337;
。但是,我不确定它在VS中是如何工作的(无论是发出警告还是错误)。
答案 2 :(得分:0)
我无法理解为什么char变量允许接受4 声明中的字符,不会产生编译时错误。
它不会将4个字符打包到一个字符中。多字符const'abcd'的类型为int,然后编译器执行常量转换以将其转换为char(在这种情况下溢出)。
答案 3 :(得分:0)
将4个字符 放入char
变量,但放入int
字符常量,然后将其分配给char
。
C标准的3个部分(C11dr§6.4.4.4)可能有所帮助:
“整数字符常量是用单引号括起来的一个或多个多字节字符的序列,如'x'。”
“整数字符常量的类型为int
。”
“包含多个字符(例如,'ab')的整数字符常量的值,或包含未映射到单字节执行字符的字符或转义序列的值是实现定义的“。
OP的char ch='abcd';
代码是int
对char
的分配,因为'abcd'
是int
。与char ch='Z';
一样,ch
的{{1}}值为int
。在这种情况下,毫不奇怪,因为'Z'
的值非常适合'Z'
。在char
的情况下,该值不适合'abcd'
,因此某些信息会丢失。各种结果都是可能的。通常在一个endian平台上,char
的值为ch
,另一个值为'a'
。
'd'
的值为'abcd'
,与int
中的12345
非常相似。
当int x = 12345;
时,可以为size(int) == 4
分配一个字符常量,例如int
。
当'abcd'
时,限制会发生变化。因此,使用8个字符size(int) != 4
,int
是可能的。等
鉴于int x = 'abcdefgh';
仅保证最小范围-32767到32767,超出2的任何内容都是不可移植的。
偶数int
的{{1}}字节序存在问题。
像int
这样的字符常量通常使用不正确,因此许多编译器都有一个警告,可以标记这个不常见的C结构。