printf()는 "%f"만 사용해도 되는데, 왜 스캔f()는 두 배로 "%lf"가 필요합니까?
왜?scanf()
필요한 것은l
「 。%lf
"를 읽을 때double
,언제printf()
" 를 사용할 수 있습니다.%f
그 논거가 의론인지 아닌지에 관계없이double
또는float
?
코드 예:
double d;
scanf("%lf", &d);
printf("%f", d);
C는 변수 인수를 사용하는 함수에 대해 플로트를 더블로 승격하기 때문입니다.포인터는 어떤 것으로도 승격되지 않기 때문에 사용하셔야 합니다.%lf
,%lg
또는%le
(또는%la
C99)를 더블로 읽습니다.
с99 since 、 C の format specificator floating floating point types in타입의 매칭은 다음과 같이 일치합니다.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
논쟁들.
C 식에서 부동 또는 이중 값을 사용하면 값이 이중이므로 printf는 차이를 구별할 수 없습니다.반면, 더블 포인터는 명시적으로 scanf에 시그널링을 해야 합니다.이것은 포인터가 가리키는 것이 중요하기 때문입니다.
scanf
에 의해 지적되는 데이터의 크기를 알 필요가 있다&d
바리에이티브 함수는 플로트를 2배로 촉진합니다(이유는 완전히 확실하지 않습니다).printf
항상 얻어지고 있다double
.
그렇지 않으면 scanf는 더블보다 작은 크기의 플로트에 포인터를 전달하고 있다고 생각하고 잘못된 값을 반환합니다.
언급URL : https://stackoverflow.com/questions/210590/why-does-scanf-need-lf-for-doubles-when-printf-is-okay-with-just-f
'programing' 카테고리의 다른 글
변환 후 VueX Getter가 실행되지 않음 (0) | 2022.07.10 |
---|---|
v-model 값을 변경할 때 @change 이벤트를 방지하는 방법 (0) | 2022.07.10 |
mapState는 정확히 어떻게 사용합니까? (0) | 2022.07.10 |
vue-i18n이 vuex를 통합한 후 로케일을 업데이트하지 않음 (0) | 2022.07.10 |
C의 바이트 배열에 대한 16진수 문자열 (0) | 2022.07.10 |