INTA=65如何计算;printf(“c”,a);在GCC中使用c语言工作?
我在Ubuntu上的GCC上试过,我不知道它的版本。但它起作用了,我想知道怎么做?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); 第一个参数必
因为根据我的说法,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.1fprintf
功能
…
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.