c printf%lf%d不同的结果

时间:2018-08-29 06:42:55

标签: c printf

MyCode

#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”)时,此结果必须为零!

2 个答案:

答案 0 :(得分:2)

请参考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)));

答案 1 :(得分:1)

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

虽然行为在一般情况下是不确定的,但您可能会在整数的小尾数法解释中看到IEEE 754 double的符号位。