打印新值时得到以前的浮点值

时间:2019-03-14 07:38:53

标签: c format-specifiers

我正在从第二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

LINK FOR IDE

2 个答案:

答案 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值,所以您会出现这种不匹配的情况。