【问题标题】:will type conversion take place in given code?类型转换会在给定的代码中发生吗?
【发布时间】:2021-05-11 13:49:19
【问题描述】:
void main()
{
printf("%f",12/7.0);
getch();
}

类型转换是否会发生在这段代码中,如果是,那么为什么会发生,如果不是,为什么不会在这段代码中发生,请解释一下?另外我认为这里是双数据类型的 7.0(根据类型转换规则)和整数数据类型的 12 会给出双精度数据类型,但是当我用 %lf 打印时,屏幕上的输出又是浮点数,我不知道不知道怎么纠正我?

【问题讨论】:

  • Implicit type promotion rules。特别是“通常的算术转换”。您需要了解常量127.0 具有与变量一样的类型。
  • 对于 printf 参数有这个en.cppreference.com/w/c/language/…,如果您想知道 7.0 是什么类型,请参阅en.cppreference.com/w/c/language/floating_constant
  • 要添加到@Lundin 有用的注释,您可以使用文字限定常量:printf("%f",12.0f/7.0f); 例如将常量限定为float(文字后缀f)。
  • 是什么让你认为输出是float?如果是double,你希望看到什么?
  • 我担心你误解了事情,我似乎是对的。所以请阅读 Jean-Baptiste 的回答,我相信你会标记它。 ;-) 然而,仔细阅读任何一本优秀的 C 书籍都可能向您揭示这一点。

标签: c type-conversion


【解决方案1】:

你不能通过打印的结果来推断表达式的类型。 printf 可能只显示部分价值...

man printf 表示 fF 格式(强调是我的):

fF

双参数被四舍五入并转换为[-]ddd.ddd样式的十进制表示法,其中 小数点字符后的位数等于精度规范。 如果缺少精度,则取6;如果精度显式为零,则无小数- 点字符出现。如果出现小数点,则在其前面至少出现一位数字。

12 是 int 文字,7.0double 文字。根据表达式求值规则,int 将提升为 double,结果将是根据格式打印的doublef 不是用于float,而是用于double)。

如果要打印由float 除法计算的值,则需要限制为float 使用:

12/7.0f

结果将是float,你可能会问我为什么要使用double 说明符呢?因为在任何可变参数函数中,每个float 都会被提升为double .因为printf 是一个可变参数函数...... 这就是为什么printf 的格式字符串中没有float 说明符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多