我正在从第二def myfunc():
str = """"""
with open("employees.html") as report_file:
raw_html = report_file.readlines()
str = """""".join(raw_html)
return str
获得输出0.23
。但是类型转换可以提供所需的输出。如果我不使用类型转换,则会打印以前的值。
编译器版本为GCC 6.3
printf
答案 0 :(得分:6)
在
> printf("%f",0);
您要求打印一个 double ,但您给出一个 int ,这是矛盾的
生成的代码不会从 int 中生成 double ,因为 printf 不是int printf(const char *, double);
,而是int printf ( const char * format, ... );
,编译器不会查看进行必要转换的格式(但在很多情况下,编译器会警告您)
当对第二个参数进行 prints 打印时,确实使用64b获得 double ,而您的 int 仅使用32b,则行为是未定义。
(编辑,谢谢@chqrlie)
我在打印新值时得到以前的浮点值
在您的情况下,可能是 printf 从MMX寄存器检索一个双精度值,而不是通过堆栈或常规寄存器传递的 int 值。可以解释为什么相同的值被打印两次。但是当然,与未定义的行为一样,任何其他情况随时可能发生
答案 1 :(得分:3)
问题是两个因素的组合:
首先是对于printf
之类的vararg函数,编译器不会对参数进行任何隐式转换。因此,参数列表中的0
是一个整数常量(类型为int
)。
第二个因素是格式说明符不匹配。 printf
函数对所传递的参数一无所知,除了格式字符串中指定的内容外。格式和参数类型不匹配会导致undefined behavior。而且由于"%f"
说明符使printf
期望的类型为double
,并且您给了int
值,所以您会出现这种不匹配的情况。