Por que scanf () precisa de "% lf" para o dobro, quando printf () está bem com apenas "% f"?

Por que é scanf()necessário que l"in" %lfao ler a double, quando printf()" %f" possa ser usado, independentemente de seu argumento ser a doubleou a float? Código de exemplo: double d; scanf("%lf", &d); printf("%f",