printf ()가 "%f"만으로도 괜찮을 때 스캔 (scanf)가 두 배에 "%lf"가 필요한 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/210590

  •  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를 명시 적으로 신호로 표시해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top