Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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 printf中的格式字符串_C_Casting - Fatal编程技术网

C printf中的格式字符串

C printf中的格式字符串,c,casting,C,Casting,输出是什么 main() { float a=4; int i=2; printf("%f %d",i/a,i/a); printf("%d %f",i/a,i/a); } 我得到的答案是:0.5000000.000000 原因:在第一个printf,%f=i/a=2/4=int/float中,隐式转换完成,i变为float,从而导致float的结果(即0.500000) 浮点的默认精度为6,所以在十进制6位之后,然后是下一个%d=i/a=2/4=0.50000

输出是什么

main()
{
    float a=4;
    int i=2;
    printf("%f %d",i/a,i/a);
    printf("%d %f",i/a,i/a);
}
我得到的答案是:
0.5000000.000000

原因:在第一个
printf
%f=i/a=2/4=int/float
中,隐式转换完成,
i
变为
float
,从而导致
float
的结果(即0.500000)

浮点的默认精度为6,所以在十进制6位之后,然后是下一个
%d=i/a=2/4=0.500000
,但是
%d
格式字符串只打印整数,所以在十进制值之后,打印0

下一步
printf
%d=i/a=2/4
print0具有相同的概念;但是,
%f=i/a=2/4=0.000000
我不理解的最后一个结果。

未定义的行为:
printf
中的所有数据类型都是隐式浮动的。这是因为
i/a
具有类型
float
,因为
int
数据被提升为浮点。因此,您必须在
printf

中专门使用
%f
printf
指定错误的格式说明符。在这两种情况下,
i/a
表达式将升级为
double
,并且您正在为一个参数指定它是
int
。在
7.19.6.1
一节中,
printf
一节为格式字符串引用的fprintf函数第9段说:

如果转换规范无效,则行为未定义。[…]

您应该启用警告,但是
gcc
clang
都将对此发出警告,而不会启动它们,在
gcc
中,我获得以下消息:

warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘double’ [-Wformat]

i/a
表达式将始终计算为
float
,因为其中一个操作数是
float
。打印时,我们使用的是说明符
%d
%f
。因此,当我们使用
%f
时,它将(应该)始终是0.5,当我们使用
%d
时,它应该是
未定义的

在使用gcc编译器的Linux(ubuntu)上,我得到以下输出(为了清晰起见,在第一次打印后添加了一个
\n
):


为什么不试试呢?你可以尝试各种各样的东西,即使不是在一台装有所有需要的东西的电脑前……你能确切地说明你不明白的是什么吗?“隐式铸造”是一种矛盾修饰法。铸造是明确的定义。您要查找的单词是“隐式转换”。还可以使用`标记内联代码,这样您编写的代码对我们的视觉效果会更好。我只看到3个输出,但看到4个格式参数到
printf
。您确定吗?
int
会不会被提升为
float
?@Bathsheba您是对的,
i/a
float
,但是在像
printf
这样的变量参数函数中,
float
被提升为
double
0.500000 2047229448
899608576 0.500000