programing

C에서 %f와 %lf의 차이는 무엇입니까?

powerit 2023. 8. 16. 22:39
반응형

C에서 %f와 %lf의 차이는 무엇입니까?

저는 C 책의 C 예에서 이 두 가지 매개 변수를 본 적이 있지만, 저자는 두 가지의 차이가 무엇인지 자세히 설명하지 않았습니다.나는 그것을 알고 있습니다.%f합니다.float그 자리를 대신해야 합니다.저는 이것을 찾아봤지만 설명을 찾는 데 어려움을 겪었습니다. 때어는?%lf?

간단히 말해서, 그것은 어떤 영향도 주지 않는다는 것입니다.printf 는 ▁of의 을 나타냅니다.float또는doublescanf.

위해서printf 형식의 float으로 double그래서 둘 다%f그리고.%lf는 에사됩다니에 됩니다.double.위해서scanf은 야합다니해를 사용해야 .%f위해서float그리고.%lf위해서double.

아래 언어 변호사에 대한 자세한 내용은 다음과 같습니다.


사이에 차이는 없습니다.%f그리고.%lf에 시대에printfISO C 참조), ISO C 섹션(C11 참조),7.21.6.1 The fprintf function, 락단/7 태상의 , 의l수식어(나의 강조점):

에 오는 " 항을지니다합정목다음다▁a"를 합니다.d,i,o,u,x또는X는 변환지 에적니다됩용에 됩니다.long int또는unsigned long int다음과 같은 주장n변환 지정자는 에 대한 포인터에 적용됩니다.long int다음과 같은 주장c는 변환지 에적니다됩용에 됩니다.wint_t다음과 같은 주장s변환 지정자는 에 대한 포인터에 적용됩니다.wchar_t인수; 또는 다음 , , , , , 또는 변환 지정자에 영향을 주지 않습니다.

가 없는 는 정할필없이입니다.f지정자는 해당 지정자가 이미 다음을 의미하기 때문입니다.double 락부에서./8 합니다.%f지정자:

A double됩니다.

인수가 섹션에 기본 .6.5.2.2 Function calls, 락단/7:

함수 프로토타입 선언기의 생략 부호로 인해 마지막으로 선언된 매개 변수 뒤에 인수 형식 변환이 중지됩니다.기본 인수 승격은 후행 인수에 대해 수행됩니다.

때부터printf(그리고 가족 전체가.printffunctions)는 like functions)로 됩니다.int printf(const char * restrict format, ...);생략 부호 표기법을 사용하면, 그 규칙이 여기에 적용됩니다.은 섹션 섹다룹다니서에션에서 .6.5.2.2 Function calls, 락단/6:

호출된 함수를 나타내는 식은 프로토타입을 포함하지 않는 유형을 가질 경우 각 인수에 대해 정수 승격이 수행되고 유형이 있는 인수는 승격됩니다. 이를 기본 인수 승격이라고 합니다.


scanf가족, 그것은 사용을 의무화합니다.double보다는 니▁rather▁a.float.7.21.6.2 The fscanf function /11:

에 오는 " 항을지니다합정목다음다▁a"를 합니다.d,i,o,u,x,X또는n 형지포 있는적인용다니됩수에 대한 포인터가 됩니다.long int또는unsigned long int, , , , , , , , 또는 변환 지정자가 형식 포인터가 있는 인수에 적용되는 것; 또는 다음이 되는 c,s또는[ 형지포 있는적인용다니됩수에 대한 포인터가 됩니다.wchar_t.

이것은 다음을 수정합니다./12다음 섹션의 단락에서 다음과 같이 명시합니다.%f:

으로 서명된 번호 ""와 합니다."와 일치합니다.NaN은 그형대 의 주어 에 대해 .strtod기능. 인수는여야 합니다.해당 인수는 부동의 포인터여야 합니다.

위해서scanf,%f을 읽어 들입니다.float,그리고.%lf을 읽어 들입니다.double.

위해서printfC99 이상에서는 둘 다 동일하며 다음 중 하나를 인쇄합니다.float 는또.double C89는%lf정의되지 않은 행동을 야기했지만, 그것을 다음과 같이 취급하는 것은 일반적인 확장이었습니다.%f.

에서 하나의 지정자를 두 개의 다른 유형에 사용할 수 있는 이유printf기본 인수 승격 때문입니다. 인수 형식입니다.float으로 double함수를 호출할 때 사용되고 함수 프로토타입의 매개 변수와 일치하지 않을 때.printf 냥보다를 double어떤 경우에도

printf 패밀리 함수를 사용하는 출력의 경우 %f와 %lf 지정자는 동일한 의미를 갖습니다. l은 무시됩니다.둘 다 더블 형식의 인수가 필요하지만, 플로트 형식의 인수는 더블로 승격되므로 플로트 형식에 대한 별도의 지정자가 없습니다.(이 프로모션은 printf와 같은 다양한 기능과 프로토타입 없이 선언된 기능에만 적용되며 일반적인 기능 호출에는 적용되지 않습니다.)롱 더블 유형의 경우 올바른 형식 지정자는 %Lf입니다.

스캔 기능 패밀리를 사용하는 입력의 경우 부동 소수점 형식 지정자는 %f, %lf 및 %Lf입니다.이러한 개체에는 각각 float, double 및 long double 형식의 개체에 대한 포인터가 필요합니다. (인수가 포인터이기 때문에 float-to-double 승격은 없습니다.플로트 값은 두 배로 승격할 수 있지만 포인터가 실제 플로트 개체를 가리켜야 하기 때문에 플로트* 포인터는 두 배로 승격할 수 없습니다.)

그러나 숫자 입력과 함께 스캔 기능을 사용할 때는 주의해야 합니다.정의된 오버플로 검사가 없으며 입력이 유형의 범위를 벗어나면 프로그램 동작이 정의되지 않습니다.안전을 위해 입력을 문자열로 읽은 다음 strtod와 같은 것을 사용하여 숫자 값으로 변환합니다.오류를 탐지하는 방법은 설명서를 참조하십시오.

%lf의 너비 한정자는 printf()에 의해 정상적으로 무시됩니다.더 정확하게 말하면, %f는 이중 변수를 사용하여 항상 float 인수를 두 배로 승격시킵니다.

언급URL : https://stackoverflow.com/questions/25860850/what-is-the-difference-between-f-and-lf-in-c

반응형