天天看點

printf的一個小技巧

每天例行代碼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';
        }
    }
}           

複制