每天例行代碼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 < 0)
prec = -1;
++f;
}
else if (isdigit(*f))
{
prec = 0;
while (*f != '\0' && isdigit(*f))
{
prec *= 10;
prec += *f++ - '0';
}
}
}
複制