[c] printf ()가“% f”만 있으면 괜찮은데 scanf ()에 왜“% lf”가 필요합니까?

왜 즉 scanf()필요 l“에 %lf“는 읽을 때 doubleprintf()사용할 수있는 ” %f인수가 있는지 여부에 관계없이” double또는를 float?

예제 코드 :

double d;
scanf("%lf", &d);
printf("%f", d);



답변

C는 가변 인수를 취하는 함수에 대해 float를 두 배로 올릴 것이기 때문입니다. 포인터는 아무것도 승격되지 않으므로 %lf, %lg또는 %le(또는 %laC99)를 사용하여 이중으로 읽으십시오.


답변

С99 때문에 C의 형식 지정 및 부동 소수점 인수 형의 정합과 일치 printf하고 scanf. 그것은

  • %f …에 대한 float
  • %lf …에 대한 double
  • %Lf …에 대한 long double

유형의 float인수가 가변 변수로 전달 될 때 이러한 인수는 암시 적으로 type으로 변환됩니다 double. 이 이유의 이유 printf형식 지정 %f%lf동등 교환 할 수있다. 에서 printf“크로스 사용”할 수 %lffloat%fdouble .

그러나 실제로 실제로 그렇게 할 이유가 없습니다. 사용하지 마십시오 %fprintf형의 인수 double. 그것은 C89 / 90 시대에 태어난 광범위한 습관이지만 나쁜 습관입니다. for에 사용 %lf하고 인수를 위해 예약 하십시오 .printfdouble%ffloat


답변

scanf요구 사항은 데이터의 크기가 가리키는되는 알고 &d가변 기능 (전적으로 있는지 왜) 복식에 수레를 추진하는 반면 때문에, 제대로을 채우기 위해 printf항상을 받고있다 double.


답변

그렇지 않으면 scanf는 double보다 작은 크기의 float에 포인터를 전달한다고 생각하고 잘못된 값을 반환합니다.


답변

C 표현식에서 float 또는 double 값을 사용하면 어쨌든 double 값이 생성되므로 printf는 그 차이를 알 수 없습니다. 포인터가 가리키는 것이 중요하기 때문에 double에 대한 포인터는 포인터와 구별되는 scanf로 명시 적으로 신호를 보내야합니다.


답변