IT

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

lottoking 2020. 5. 24. 11:14
반응형

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당신은 "사용을 건너"수 %lf와 함께 float또는 %f함께 double.

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


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


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


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

참고 URL : https://stackoverflow.com/questions/210590/why-does-scanf-need-lf-for-doubles-when-printf-is-okay-with-just-f

반응형