C 使用int打印字符常量
我写了下面的程序C 使用int打印字符常量,c,int,C,Int,我写了下面的程序 #include<stdio.h> int main(void) { int i='A'; printf("i=%c",i); return 0; } 所以我尝试了另一个程序 #include<stdio.h> int main(void) { int i='ABC'; printf("i=%c",i); return 0; } 但结果却相反 i=C 我不明白为什么?在C中,'A'是一个int常量,它保证适合字符 “ABC”是一个多字符常量。它有
#include<stdio.h>
int main(void)
{
int i='A';
printf("i=%c",i);
return 0;
}
所以我尝试了另一个程序
#include<stdio.h>
int main(void)
{
int i='ABC';
printf("i=%c",i);
return 0;
}
但结果却相反
i=C
我不明白为什么?在C中,
'A'
是一个int
常量,它保证适合字符
“ABC”
是一个多字符常量。它有一个int
类型,但有一个实现定义的值。根据本标准第6.4.4.4.10节的规定,如果值不能放入字符中,则使用%c
打印printf
的行为可能是未定义的
整数字符常量的类型为int。整数的值
字符常量,其中包含映射到
单字节执行字符是
被解释为整数的映射字符的表示形式。这个
包含多个字符的整数字符常量的值
字符(例如,“ab”),或包含字符或转义序列
不映射到单个byteexecution字符的
实现定义。如果整数字符常量包含
单个字符或转义序列,其值是结果
当一个char类型的对象的值是单个
字符或转义序列转换为int类型
在这种情况下,'A'==0x41
,'B'==0x42
,'C'==0x43
,然后编译器将i
解释为0x414243
。正如在另一个答案中所说,该值取决于实现
当您尝试使用'%c'
访问它时,溢出部分将被切断,只剩下0x43
,即'c'
要了解更多信息,请阅读的答案。此调用中使用的转换说明符c
printf("i=%c",i);
实际上,从整数参数中提取一个字符。因此,在任何情况下,使用此说明符都不能获得三个字符作为输出
来自C标准(7.21.6.1 fprintf函数)
c如果不存在l长度修饰符,int参数将转换为
一个无符号字符,并写入结果字符
考虑到多字节字符常量的内部表示是由实现定义的。来自C标准(6.4.4.4字符常数)
…包含多个字符(如“ab”)或包含字符或转义符的整型字符常量的值
不映射到单字节执行字符的序列为
已定义实施
如果希望i包含3个字符,则需要初始化包含3个字符的数组
chari[3];
i[0]=“A”;
i[1]=“B”;
i[2]='C'代码>
“”只能包含一个字符。如果您的代码将整数i转换为字符,则最好将转换后的8位字符存储在32位整数中。但我认为您需要将32位分隔成8位容器,形成一个类似char i[3]的char数组。然后你会看到
int j=i;
这将导致错误,因为无法将字符数组转换为整数。'ABC'
是一个整数字符常量。根据代码集(它是ASCII)、endian、int
width(在OP的情况下显然是32位),它可能具有如下相同的值。它是实现定义的行为
'ABC'
0x41424300
0x434241
or others.
%c”
指示printf()
获取int
值,将其转换为无符号字符
,并打印相关字符。这是信息明显丢失的主要原因
在OP的情况下,i
的值似乎为0x434241
int i='A';
printf("i=%c",i); --> 'A'
// same as
printf("i=%c",0x434241); --> 'A'
“%c”
永远不会打印3个字符。是否打开了编译器警告?你的编译器一点也不哭吗?“A”符号是用来指定单个字符的ABC'是3个字符,当您在字符文字表示法中指定超过1个字符时会发生什么情况是非标准的,这取决于您的特定编译器。发生的也可能是未定义的行为。但是-您应该告诉我们您使用的编译器。请阅读警告。他们会告诉你@C没有指定任何字符文字<代码>'ABC'
是一个整数字符常量,包含多个字符。从技术上讲,它不是非标准的。。。它确实依赖于实现,但它显然是标准的一部分。请参阅第节标准没有为A、B和C指定这些值谢谢。我很高兴我总能从中学到一些东西,所以不仅仅是在我提问的时候,而且在我回答问题的时候。@chux:是的,这不是你第一次用我草率的术语训斥我;特别是在该区域,printf
将期望int
参数与%c
格式说明符匹配,并将int
值转换为无符号字符
值。所有这些都不是未定义的行为,但输出将是实现定义的,因为int
值是实现定义的。
'ABC'
0x41424300
0x434241
or others.
int i='A';
printf("i=%c",i); --> 'A'
// same as
printf("i=%c",0x434241); --> 'A'