我在分割两个数字并用printf
显示结果时偶然发现了一个问题。我在那里得到了奇怪的数字。
使用std::cout
一切正常,但不适用于printf,为什么?
我始终使用printf()
作为屏幕输出,并且知道可以使用std::cout
。 (同样的结果)
int a;
int b;
float z = (float)a / (float) b;
printf("%d", z);
答案 0 :(得分:1)
由于printf
是一个可变函数,因此参数只进行标准转换(例如char
转换为int
),它们不会自动转换为适合的类型格式说明符。 %d
说明符要求其参数为int
,但您给它一个float
,因此结果是垃圾。要打印float
,您应该使用%f
:
printf("%f", z);
当您使用cout << z
时,这不是必需的,因为<<
使用函数重载来执行特定于类型的格式化。
答案 1 :(得分:0)
printf
的工作方式是它需要&#34;可变参数&#34;。这意味着在printf中不知道参数,而是一些&#34; magic&#34;代码用于获取它们。 printf
使用格式字符串(在本例中为"%d"
)来确定参数的类型 - int
为"%d"
。由于z
实际上是float
,因此它将打印z
的整数表示 - 这可能是一些非常大的数字。 [1]
您应修改代码以使用正确的格式,在这种情况下,"%f"
似乎是一个不错的选择。
大多数现代编译器还有一种方法可以检查格式字符串和传递的实际参数是否匹配,因此在编译代码时应该启用警告,以便为您提供有关未传递正确参数的有意义(ish)消息。
[1]至少在Linux上的x86-64中,float参数在SSE寄存器中传递,并存储在一个单独的内存块中,因此不匹配的参数不会打印浮点数的整数表示,它会打印一些&# 34;随机&#34;数字取自通常通过的整数。