【问题标题】:why do i get 2.168831 while executing printf("%f",3/2)? [duplicate]为什么我在执行 printf("%f",3/2) 时得到 2.168831? [复制]
【发布时间】:2013-10-20 09:41:12
【问题描述】:
#include<stdio.h>
#include<math.h>
int main()
{

printf("%f",3/2);
printf(" %d",3/2);
printf(" %d",3<<2);
return 0;

}

这是我的代码,我希望得到 1.50000 1 12

但我收到了 2.168831 1 12

作为我的输出。

【问题讨论】:

  • 整数除法产生整数,它会截断小数部分。这在每个相当不错的初学者 C 教程中都有写,在 Stack Overflow 上至少有一百个答案。做一些研究。
  • 您好,感谢您的回复,我很新在这里很抱歉尝试搜索但无法搜索。另外,如果你能告诉我它是如何工作的......因为在我的脑海里它是 (int)3/2 = (int)1 然后浮点值应该是 1.000000
  • 是什么让您相信它应该是 1.000? printf() 不是魔法。它对您传递给它的表达式的类型完全一无所知(这就是您必须使用格式字符串的原因)。这不是魔术。但是阅读已接受的重复答案,您就会知道。
  • 如果我错了,请纠正我,但显示的值是垃圾值还是有什么意义?
  • 由于未定义的行为,它没有意义。 已阅读链接问题的答案。

标签: c printf floating


【解决方案1】:

您会得到混合错误转换的字节(您传递的整数)和堆栈中的瞬态数据,格式为浮点数。 @H2CO3 给了很好的参考。

这是因为您传递了一个int,但您告诉printf() 期望一个浮点值(特别是双精度值)。如果使用 %f 作为格式,则需要传递一个双精度。不这样做会导致未定义和错误地访问堆栈上的未定义/垃圾值。

两个操作数整数3 / 2 将执行整数除法。将一个或两个操作数加倍,即3.0 / 2,您将进行浮点除法,并且 printf() 将按您的预期运行。

【讨论】:

    猜你喜欢
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    相关资源
    最近更新 更多