我尝试在 printf 中将字符打印为浮点数并得到输出 0。这是为什么?
还:
char c='z';
printf("%f %X",c,c);
给出了一些奇怪的十六进制输出,而当我这样做时输出是正确的:
printf("%X",c);
为什么会这样呢?
The printf()
函数是一个variadic函数,这意味着您可以向其传递可变数量的未指定类型的参数。这也意味着编译器不知道函数需要什么类型的参数,因此它无法将参数转换为正确的类型。 (如果您的参数错误,现代编译器会警告您printf
,如果您使用足够的警告标志来调用它。)
由于历史原因,您不能传递等级小于的整数参数int
,或者等级小于的浮动类型double
到一个可变参数函数。 Afloat
将被转换为double
and a char
将被转换为int
(or unsigned int
关于奇怪的实现)通过一个称为默认参数促销.
When printf
解析它的参数(参数是传递给一个函数,参数就是函数的内容receives),它使用适合格式字符串指定的类型的任何方法来检索它们。这"%f"
说明符期望一个double
. The "%X"
说明符期望一个unsigned int
.
如果您通过了int
and printf
尝试检索一个double
,你调用未定义的行为.
如果您通过了int
and printf
尝试检索一个unsigned int
,你调用未定义的行为.
未定义的行为可能包括(但不限于)打印奇怪的值、使程序崩溃或(其中最阴险的)完全按照您的预期进行。
Source: n1570 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf(现行C标准的最终公开草案)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)