为什么clang 3.8警告使用带有%f printf格式说明符的浮点数?

时间:2017-03-25 02:43:59

标签: c clang compiler-warnings

此代码:

#include <stdio.h>
int main(void)
{
  float value = 10.10f;
  printf("%f\n",value);
}

使用Ubuntu 14.04.1上的clang 3.8使用-Weverything选项编译:

clang -Weverything w-double-precision.c 
w-double-precision.c:5:17: warning: implicit conversion increases floating-point precision: 'float' to 'double' [-Wdouble-promotion]
  printf("%f\n",value);
  ~~~~~~        ^~~~~
1 warning generated. 

1 个答案:

答案 0 :(得分:4)

printf()函数是可变参数 vararg 函数;一个接受可变数量的参数。 在cppreference.com中定义printf()函数的方式如下:

int printf( const char *format, ... );

...表示此函数可以接受可变数量的参数。

可变参数函数中,如果向其传递float类型的变量,它将自动将其转换为double值;从类型float到类型double隐式转换已完成。

在代码中,除了value参数之外,还将浮点类型变量printf()传递给"%f\n",作为附加参数。因此,由于printf() vararg 函数,因此在将value作为参数传递之前,它会将double转换为类型<div class="row"> <div class="col-md-2" style="text-align: left"> Red: </div> <div class="col-md-2" style="text-align: left"> Apple </div> </div> <div class="row"> <div class="col-md-2" style="text-align: left"> Green: </div> <div class="col-md-2" style="text-align: left"> Grass </div> </div> <div class="row"> <div class="col-md-2" style="text-align: left"> Blue: </div> <div class="col-md-2" style="text-align: left"> Ocean </div> </div> 。根据您保存编译器警告的高度,它会向您发出警告。

希望这有帮助!

相关问题