【问题标题】:c printf %lf %d different result [closed]c printf %lf %d 不同的结果[关闭]
【发布时间】:2018-08-29 06:42:55
【问题描述】:

我的代码

#include<stdio.h>
int main(){
  printf("result1 : %lf %d\n", (1 - (double)((int)1)), (1 - (double)((int)1)));
  return 1;
}

结果

result1 : 0.000000, 1

我不明白这个结果。

我想printf("%d")的时候,这个结果一定是0!

【问题讨论】:

  • %d 部分是未定义的行为 - 您的结果不能同时是 doubleint

标签: c printf


【解决方案1】:

请参阅printf 参考以发现"%d" 格式说明符需要int 作为参数。但是,您将其传递给double。这是undefined behavior,这意味着任何事情都可能发生,包括您得到的结果(有关可能发生的事情的更多详细信息,请参阅例如What happens to a float variable when %d is used in a printf?)。

请尝试向int 添加演员:

printf("result1 : %lf %d\n", (1 - (double)((int)1)), (int) (1 - (double)((int)1)));

【讨论】:

  • 很好的解释,您还可以在 OP 的问题中添加为什么第二个结果被转换为 double 而不是 Integer
  • @Alan :我不确定你的意思。第三个参数一个double(由于usual arithmetic conversions),和第二个参数一样(毕竟是同一个表达式)。
  • 我的问题是,当您将第二个结果转换为 (double) (int) 时,优先级是什么,为什么它会被转换为 double 而不是 int
  • @Alan:你真的应该问你自己的问题,但简单地说:type casts are right-to-left associative
  • 明白了,谢谢 Sander!
【解决方案2】:

传递给printf 的参数类型本质上与格式字符串无关。您有责任确保类型匹配。在这种情况下,您将传递两个 double 值。但是,格式字符串试图将第二个解释为整数。这是未定义的行为。

虽然在一般情况下行为未定义,但您很可能在整数的小端解释中看到 IEEE 754 双精度的符号位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    相关资源
    最近更新 更多