printf ()가 "%f"만으로도 괜찮을 때 스캔 (scanf)가 두 배에 "%lf"가 필요한 이유는 무엇입니까?
-
03-07-2019 - |
문제
왜 그런가요? scanf()
필요합니다 l
안에 "%lf
"읽을 때 a double
, 언제 printf()
사용할 수 있습니다 "%f
"그 주장이 a double
또는 a float
?
예제 코드 :
double d;
scanf("%lf", &d);
printf("%f", d);
해결책
C는 변수 인수를 취하는 함수에 대해 플로트를 복식으로 홍보하기 때문에. 포인터는 아무것도 홍보하지 않으므로 사용해야합니다. %lf
, %lg
또는 %le
(또는 %la
C99)에서는 복식으로 읽습니다.
다른 팁
с99 이후 C의 형식 지정자와 부동 소수점 인수 유형 간의 일치는 일관성이 있습니다. printf
그리고 scanf
. 그것은이다
%f
~을 위한float
%lf
~을 위한double
%Lf
~을 위한long double
유형의 논쟁이있을 때 그렇게됩니다 float
변수 매개 변수로 전달되며, 그러한 인수는 암시 적으로 유형으로 변환됩니다. double
. 이것이 이유입니다 printf
형식 지정자 %f
그리고 %lf
동등하고 상호 교환 가능합니다. ~ 안에 printf
"크로스 사용"할 수 있습니다. %lf
~와 함께 float
또는 %f
~와 함께 double
.
그러나 실제로 실제로 할 이유가 없습니다. 사용하지 마십시오 %f
에게 printf
유형의 주장 double
. C89/90 배로 돌아온 광범위한 습관이지만 나쁜 습관입니다. 사용 %lf
안에 printf
~을 위한 double
그리고 유지하십시오 %f
예약 float
논쟁.
scanf
다음과 같이 지적하는 데이터의 크기를 알아야합니다. &d
Variadic 함수는 플로트를 복식으로 홍보하는 반면 (이유는 확실하지 않음). printf
항상 a를 얻고 있습니다 double
.
그렇지 않으면 scanf는 당신이 두 배보다 작은 크기의 플로트에 포인터를 전달한다고 생각하기 때문에 잘못된 값을 반환합니다.
C 표현식에서 플로트 또는 이중 값을 사용하면 어쨌든 이중 인 값이 발생하므로 Printf는 차이를 말할 수 없습니다. 이중에 대한 포인터는 포인터가 가리키는 것이 중요하기 때문에 포인터와 플로트와 구별되는 Scanf를 명시 적으로 신호로 표시해야합니다.