double in printf의 올바른 형식 지정자
올바른 형식 지정자는 무엇입니까?doubleprintf로요?그런가요?%f아니면?%lf내 생각엔%f잘 모르겠어요.
코드샘플
#include <stdio.h>
int main()
{
double d = 1.4;
printf("%lf", d); // Is this wrong?
}
"%f"는 (또는 적어도1개의) 더블의 올바른 형식입니다.의 형식은 없습니다.float, 왜냐하면 당신이 통과를 시도했을 때float로.printf로 승격됩니다.double전에printf수신합니다1. "%lf"또한 현행 표준 하에서도 허용됩니다.l그 뒤에 있는 경우 효과가 없는 것으로 지정됩니다.f변환 지정자(특히).
이 장소에서는,printf형식 문자열은 와 크게 다르다scanf(그리고fscanf, 등) 포맷 문자열.출력의 경우 값을 전달하고 있습니다. 이 값은 다음 값에서 승격됩니다.float로.doublevariadic 파라미터로 전달되는 경우.입력의 경우 포인터를 전달하고 있지만 승격되지 않았으므로 다음과 같이 알려야 합니다.scanf읽고 싶은지 아닌지float또는double에 대해서는scanf,%f읽고 싶다는 의미입니다.float그리고.%lf읽고 싶다는 의미입니다.double(그리고, 그 가치가 있는 것은, 잠시 동안,long double, 를 사용합니다.%Lf어느 쪽이든printf또는scanf).
1. C99, §6.5.2/6 : "호출함수를 나타내는 식에 프로토타입을 포함하지 않는 형식이 있으면 각 인수에 대해 정수 승진을 하고 유형 플로트를 갖는 인수는 2배로 승격한다.이를 디폴트 인수 프로모션이라고 합니다.C++에서는 표현은 다소 다르지만(예를 들어 "protype"이라는 단어를 사용하지 않음), 효과는 동일합니다. 즉, 모든 가변 파라미터가 함수에 의해 수신되기 전에 기본 프로모션을 수행합니다.
그럴 수 있다.%f,%g또는%e숫자 형식을 지정하는 방법에 따라 달라집니다.자세한 내용은 여기를 참조하십시오.그l에 수식어가 필요합니다.scanf와 함께double, 단, 에 없습니다.printf.
C99 표준(즉 N1256 드래프트)의 경우 규칙은 fprintf(printf, sprintf, ...) 또는 scanf 함수 종류에 따라 달라집니다.
추출된 관련 부품은 다음과 같습니다.
서문
이 제2판은 ISO/IEC 9899/COR1:1994, ISO/IEC 9899/AMD1:1995 및 ISO/IEC 9899/COR2:1996에 의해 수정 및 수정된 초판 ISO/IEC 9899:1990을 취소하고 대체합니다.이전 에디션에서 크게 변경된 내용은 다음과 같습니다.
%lf변환 지정자가 허용됨printf7.19.6.1그
fprintf기능.7 길이 수식어와 그 의미는 다음과 같다.
l (ell) (...)이 다음의 a, A, e, E, f, F, g 또는 G 변환 지정자에 영향을 주지 않음을 지정합니다.
L 다음 a, A, e, E, f, F, g 또는 G 변환 지정자가 긴 이중 인수에 적용되도록 지정합니다.
에 대해 지정된 것과 동일한 규칙fprintf지원하다printf,sprintf및 유사한 기능을 제공합니다.
7.19.6.2그
fscanf기능.11 길이 수식어와 그 의미는 다음과 같다.
l (ell) 다음 a, A, e, E, f, F, g 또는 G 변환 지정자가 타입 포인터를 2배로 하는 인수에 적용되는 것을 지정합니다.
L 다음 a, A, e, E, f, F, g, 또는 G 변환 지정자가 긴 이중 인수에 적용되도록 지정합니다.
12 변환 지정자와 그 의미는 다음과 같습니다.a, e, f, g는 옵션으로 부호화된 부동 소수점 숫자와 일치합니다. (...)
14 변환 지정자 A, E, F, G 및 X도 유효하며 각각 a, e, f, g 및 x와 동일하게 동작한다.
한마디로 말하면fprintf다음의 지정자 및 대응하는 타입이 지정됩니다.
%f-> 2배%Lf-> 긴 더블.
및 을 위해fscanf그 이유는 다음과 같습니다.
%f-> 플로트%lf-> 2배%Lf-> 긴 더블.
포맷%lf완전히 정확하다printf을 위해 포맷하다.double사용하신 그대로입니다.코드에는 아무런 문제가 없습니다.
포맷%lf에printf는 C 언어의 오래된 버전(C99)에서는 지원되지 않았습니다.이 버전에서는 포맷 지정자 간에 피상적인 "불일관성"이 생깁니다.double에printf그리고.scanf그 표면적인 불일치는 C99에서 수정되었다.
를 사용할 필요가 없습니다.%lf와 함께double에printf를 사용할 수 있습니다.%f괜찮으시다면 (도)%lf그리고.%f등가printf). 그러나 현대 C에서는 다음과 같이 사용하는 것이 이상적입니다.%f와 함께float,%lf와 함께double그리고.%Lf와 함께long double양쪽에서 일관되게printf그리고.scanf.
%Lf(대문자에 주의해 주세요.L)는 롱 더블 포맷 지정자입니다.
플레인용doubles,어느 하나%e,%E,%f,%g또는%G할 거다.
언급URL : https://stackoverflow.com/questions/4264127/correct-format-specifier-for-double-in-printf
'source' 카테고리의 다른 글
| 음의 부동소수점 0은 C에서 false로 평가되는 것이 보증됩니까? (0) | 2022.11.03 |
|---|---|
| java.util 간의 간단한 변환.날짜 및 XMLGregorian 캘린더 (0) | 2022.11.03 |
| IntelliJ 클래스 경로에 속성 파일 추가 (0) | 2022.11.03 |
| 레일 프로젝트에서 MySQL 대신 MariaDB 사용 (0) | 2022.11.03 |
| MySQL: SyntaxError:예기치 않은 식별자 (0) | 2022.11.03 |