Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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
INTA=65如何计算;printf(“c”,a);在GCC中使用c语言工作?_C_Gcc_Compiler Errors_Char_Int - Fatal编程技术网

INTA=65如何计算;printf(“c”,a);在GCC中使用c语言工作?

INTA=65如何计算;printf(“c”,a);在GCC中使用c语言工作?,c,gcc,compiler-errors,char,int,C,Gcc,Compiler Errors,Char,Int,我在Ubuntu上的GCC上试过,我不知道它的版本。但它起作用了,我想知道怎么做? 因为根据我的说法,char的大小小于int,因此不可能这样做。这是因为。当作为printf的变量参数列表的一部分传递时,小于int的任何内容都将在调用之前转换为int。因此,printf(“%c”,foo)无法区分char foo和int foo之间的区别。(但是,如果传递给%c的数据值超出无符号字符的范围,则行为未定义。)函数具有以下声明: int a=65; printf("%c", a); 第一个参数必

我在Ubuntu上的GCC上试过,我不知道它的版本。但它起作用了,我想知道怎么做?
因为根据我的说法,char的大小小于int,因此不可能这样做。

这是因为。当作为
printf
的变量参数列表的一部分传递时,小于
int
的任何内容都将在调用之前转换为
int
。因此,
printf(“%c”,foo)
无法区分
char foo
int foo
之间的区别。(但是,如果传递给
%c
的数据值超出
无符号字符的范围,则行为未定义。)

函数具有以下声明:

int a=65; 
printf("%c", a);
第一个参数必须是指向
char
数组的指针,但是任何附加参数都可以是任何类型的,因此如果格式说明符与参数不匹配(尽管它是未定义的行为),这不是编译器错误

但是,由于
%c
的预期,这仍然有效。从手册页:

如果不存在l修饰符,int参数将转换为 无符号字符,并写入结果字符。如果一个l 如果存在修饰符,则wint_t(宽字符)参数为 通过调用wcrtomb(3)转换为多字节序列 函数,转换状态从初始状态开始, 然后写入生成的多字节字符串


从上面的段落中,
%c
实际上需要一个
int
,并将其转换为
无符号字符进行打印。那么如果是这样,为什么传递一个实际的
char
会起作用呢?这是因为整数促销。任何小于
int
的整数类型都会升级到
int
可以使用
int
的任何位置。由于
printf
是可变的,因此无法检查其参数的类型,因此,当调用函数时,传递给
printf
char
将被提升为
int

它工作,因为它只打印字符。在ASCII表65中转换为char类型的
65
的值是字母a,因此当您输入:

int printf(const char *format, ...);
检查这里的ASCII表

7.21.6.1
fprintf
功能 …
8转换说明符及其含义为:

c
如果不存在
l
长度修饰符,则将
int
参数转换为
无符号字符
,并写入结果字符。 如果存在
l
长度修饰符,则
wint\u t
参数将被转换为 无精度的ls转换规范和指向 对于
wchar\u t
的两元素数组的初始元素,第一个元素 包含
wint
参数到
lc
转换规范和 第二个字符为空宽字符。

因此,
(f)printf
期望与
%c
转换说明符对应的参数具有类型
int
,并在格式化和显示之前将其转换为
无符号字符

65
当然可以放在
无符号字符中(0-255),因此转换没有问题。如果传递的整数值超出该范围,则我怀疑以下因素起作用:

6.3转换 6.3.1.3有符号和无符号整数 …
2否则,如果新类型是无符号的,则通过重复添加或 比新类型中可以表示的最大值多减去一个 直到值在新类型的范围内。60)
60)规则描述的是基于数学值的算法,而不是给定类型表达式的值。
这样,如果您传递值
321
,它应该“环绕”回
65
'A'
,ASCII格式)

检查此处的65值。你会找到答案的。请不要通过反复试验来学习C。根据某些测试,存在未定义的行为,可能会让你认为某些东西是单向工作的,但实际上只是非法代码,将来可能会破坏一切。该行为是未定义的-我认为它是定义的,因为@EugeneSh将
int
转换为
unsigned char
。嗯,你可能是对的。我说过,因为“如果任何参数不是相应转换规范的正确类型,那么行为是未定义的”,但是
%c
的“正确类型”实际上是
int
。然而,我仍然不能完全确定7.21.6.1p8文本中的“转换为无符号字符”是否意味着“如同通过6.3.1.3p2中的算法一样”。
int a = 65;
printf("%c", a); //---> a coverted to char type.