Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用int打印字符常量_C_Int - Fatal编程技术网

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'