printf에서 double에 대한 올바른 형식 지정자
double
printf에서 올바른 형식 지정자는 무엇입니까 ? 그것은인가 %f
또는 그 것이다 %lf
? 나는 그것을 믿지만 %f
확실하지 않습니다.
코드 샘플
#include <stdio.h>
int main()
{
double d = 1.4;
printf("%lf", d); // Is this wrong?
}
"%f"
double에 대한 올바른 형식입니다. 이 없는 A의 어떤 형식은 float
당신이를 통과하려고하면 때문에, float
에 printf
,이 승진 할 수 있습니다 double
전에 printf
그것을 받아 1 . "%lf"
또한 현재 표준에서 허용됩니다.- 변환 지정자가 l
뒤따를 경우 효과가없는 것으로 지정됩니다 f
.
이것은 printf
형식 문자열 이 형식 문자열과 scanf
(및 fscanf
등) 실질적으로 다른 곳입니다 . 출력의 경우, 당신은 전달하는 값 에서 추진됩니다 float
에 double
가변 인자 매개 변수로 전달하는 경우입니다. 입력의 경우 당신은 전달하는 포인터 당신이 말할 필요가 있으므로, 승진되지 않으며, scanf
당신이 읽을 것인지 float
또는를 double
정도, scanf
, %f
당신은을 읽을 수 수단 float
과 %lf
당신이를 읽으려는 수단을 double
그것이 무엇을 위해, (그리고 가치는을 위해 long double
, 당신은 사용 %Lf
중 하나에 대한 printf
또는 scanf
).
1. C99, §6.5.2.2 / 6 : "호출 된 함수를 나타내는 표현식에 프로토 타입이 포함되지 않은 유형이있는 경우 각 인수에 대해 정수 승격이 수행되고 float 유형의 인수는 두 배로 승격됩니다. 이것을 기본 인수 프로모션이라고합니다. " C ++에서 표현은 약간 다릅니다 (예 : 단어 "prototype"을 사용하지 않음). 그러나 효과는 동일합니다. 모든 variadic 매개 변수는 함수가 받기 전에 기본 승격을받습니다.
C99 표준 (즉, N1256 초안)이 주어지면 규칙은 함수 종류 fprintf (printf, sprintf, ...) 또는 scanf에 따라 달라집니다.
추출 된 관련 부품은 다음과 같습니다.
머리말
이 두 번째 버전은 ISO / IEC 9899 / COR1 : 1994, ISO / IEC 9899 / AMD1 : 1995 및 ISO / IEC 9899 / COR2 : 1996에 의해 수정 및 수정 된 첫 번째 버전 인 ISO / IEC 9899 : 1990을 취소하고 대체합니다. 이전 버전의 주요 변경 사항은 다음과 같습니다.
%lf
허용되는 변환 지정자printf
7.19.6.1
fprintf
기능7 길이 수정 자와 그 의미는 다음과 같습니다.
l (ell) (...)가 다음 a, A, e, E, f, F, g 또는 G 변환 지정자에 영향을 미치지 않도록 지정합니다.
L 다음 a, A, e, E, f, F, g 또는 G 변환 지정자가 long double 인수에 적용되도록 지정합니다.
지정된 동일한 규칙이 fprintf
적용 printf
, sprintf
및 이와 유사한 기능을한다.
7.19.6.2
fscanf
기능11 길이 수정 자와 그 의미는 다음과 같습니다.
l (ell) 다음의 a, A, e, E, f, F, g 또는 G 변환 지정자가 double에 대한 포인터 유형의 인수에 적용되도록 지정합니다 (...).
L 다음 a, A, e, E, f, F, g 또는 G 변환 지정자가 long double에 대한 포인터 유형을 가진 인수에 적용되도록 지정합니다.
12 변환 지정자와 그 의미는 다음과 같습니다. a, e, f, g 선택적으로 부호있는 부동 소수점 숫자 (...)와 일치합니다.
14 변환 지정자 A, E, F, G 및 X도 유효하며 각각 a, e, f, g 및 x와 동일하게 작동합니다.
fprintf
다음 지정자와 해당 유형에 대한 간략한 설명 이 지정됩니다.
%f
-> 더블%Lf
-> 롱 더블.
그리고 fscanf
그것은 :
%f
-> 플로트%lf
-> 더블%Lf
-> 롱 더블.
그것은 할 수있다 %f
, %g
또는 %e
당신이 수를 포맷하는 방법에 따라 달라집니다. 자세한 내용은 여기 를 참조하십시오. l
수정이 필요하다 scanf
으로 double
하지만, NOT IN printf
.
에 대한 올바른 printf
형식은 double
입니다 %lf
. 코드에는 아무런 문제가 없습니다.
C 언어의 이전 (C99 이전) 버전에서는 형식 %lf
in printf
이 지원되지 않았으며 double
in printf
및의 형식 지정자간에 피상적 인 "일관되지 않음"이 발생 했습니다 scanf
. 이러한 불일치가 C99에서 수정되었습니다.
그래서 현대 C에서 그것을 사용하는 것을 선호하는 완벽한 의미가 %f
와 float
, %lf
로 double
와 %Lf
함께 long double
지속적으로 모두 printf
와 scanf
.
%Lf
(자본 참고 L
) long doubles 의 형식 지정자 입니다 .
일반의 경우 doubles
중, %e
, %E
, %f
, %g
또는 %G
할 것입니다.
참고 URL : https://stackoverflow.com/questions/4264127/correct-format-specifier-for-double-in-printf
도와주세요.
'development' 카테고리의 다른 글
async / await-언제 작업 대 무효를 반환합니까? (0) | 2020.02.17 |
---|---|
GitHub에 대한 이슈 코멘트에서 커밋을 어떻게 참조 할 수 있습니까? (0) | 2020.02.17 |
Docker에서 "노출"과 "게시"의 차이점은 무엇입니까? (0) | 2020.02.17 |
Matplotlib에서 그림 제목 및 축 레이블 글꼴 크기를 어떻게 설정합니까? (0) | 2020.02.17 |
Visual Studio C / C ++ 콘솔 응용 프로그램에서 콘솔 창이 닫히지 않도록 방지 (0) | 2020.02.17 |