每天例行代码review看到的一个小技巧,分享给大家。
代码效果是这样的,通过改变参数变量控制浮点数的打印精度。代码如下:
int precision = 3;
float position = 1.231236;
printf("%.*f\n", precision, position);
通过改变precisition的精度值可以控制position的打印精度。等价于下列代码:
float position = 1.231236;
printf("%.3f\n", position);
用变量控制浮点数精度打印范围,极大提高代码的灵活性。
问了下同事,这里为什么这样做的?得到的答案有些无语,说是在其他地方看到有这样写就拿来用了。虽然可以这样用,还是要找出使用的根据。
在http://www.cplusplus.com/reference/cstdio/printf/找到了以下信息:
.*:精度不是在格式字符串中指定的,而是作为必须格式化的参数之前的附加整数值参数指定的。
另外还找了glibc的printf的对应部分实现源码:
/* Get the precision. */
/* -1 means none given; 0 means explicit 0. */
prec = -1;
if (*f == '.')
{
++f;
if (*f == '*')
{
/* The precision is given in an argument. */
nextarg(prec, int);
/* Avoid idiocy. */
if (prec
prec = -1;
++f;
}
else if (isdigit(*f))
{
prec = 0;
while (*f != '\0' && isdigit(*f))
{
prec *= 10;
prec += *f++ - '0';
}
}
}
领取专属 10元无门槛券
私享最新 技术干货