왜 즉 scanf()
필요 l
“에 %lf
“는 읽을 때 double
때 printf()
사용할 수있는 ” %f
인수가 있는지 여부에 관계없이” double
또는를 float
?
예제 코드 :
double d;
scanf("%lf", &d);
printf("%f", d);
답변
C는 가변 인수를 취하는 함수에 대해 float를 두 배로 올릴 것이기 때문입니다. 포인터는 아무것도 승격되지 않으므로 %lf
, %lg
또는 %le
(또는 %la
C99)를 사용하여 이중으로 읽으십시오.
답변
С99 때문에 C의 형식 지정 및 부동 소수점 인수 형의 정합과 일치 printf
하고 scanf
. 그것은
%f
…에 대한float
%lf
…에 대한double
%Lf
…에 대한long double
유형의 float
인수가 가변 변수로 전달 될 때 이러한 인수는 암시 적으로 type으로 변환됩니다 double
. 이 이유의 이유 printf
형식 지정 %f
과 %lf
동등 교환 할 수있다. 에서 printf
“크로스 사용”할 수 %lf
와 float
나 %f
에double
.
그러나 실제로 실제로 그렇게 할 이유가 없습니다. 사용하지 마십시오 %f
에 printf
형의 인수 double
. 그것은 C89 / 90 시대에 태어난 광범위한 습관이지만 나쁜 습관입니다. for에 사용 %lf
하고 인수를 위해 예약 하십시오 .printf
double
%f
float
답변
scanf
요구 사항은 데이터의 크기가 가리키는되는 알고 &d
가변 기능 (전적으로 있는지 왜) 복식에 수레를 추진하는 반면 때문에, 제대로을 채우기 위해 printf
항상을 받고있다 double
.
답변
그렇지 않으면 scanf는 double보다 작은 크기의 float에 포인터를 전달한다고 생각하고 잘못된 값을 반환합니다.
답변
C 표현식에서 float 또는 double 값을 사용하면 어쨌든 double 값이 생성되므로 printf는 그 차이를 알 수 없습니다. 포인터가 가리키는 것이 중요하기 때문에 double에 대한 포인터는 포인터와 구별되는 scanf로 명시 적으로 신호를 보내야합니다.