2012-02-15 4 views
5

나는 거기에있다.두 배로 된 C 잘못된 결과 결과

내가 C를 배우고 나는이 코드를 가지고 :이 코드

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    double buyval, deliveredval, change; 

    printf("What's the buy value? "); 
    scanf("%lf", &buyval); 

    do{ 
     printf("What's the value delivered? "); 
     scanf("%lf", &deliveredval); 

     if (deliveredval < buyval){ 
      printf("Delivered value must be greater then buy value \n\n"); 
     } 
    } while (deliveredval < buyval); 

    change = deliveredval - buyval; 

    printf("Change is %4.2lf", change); 
    return 0; 
} 

을, 마지막 인쇄는 항상 0.00하지만

printf("Change is %4.2f", change); 

printf("Change is %4.2lf", change); 

을 변경할 수있다

예상대로 작동합니다. 왜 그런가요? 복식은 형식이 지정되지 않았습니까?

답변

5

"%f"doubles (및 floats는 자동으로 double으로 변환 됨)입니다. %Lflong double에 해당합니다. C99 Standard (또는 PDF)에서 printf 지정자의 모든 것을 읽을 수 있습니다. "%lf" ("%f" 같은) double S를 인쇄하는 것이다

포맷 지시자 "%lf"l은 효과가 없다.

결과는 정상적인 C99 컴파일러/구현과 동일해야합니다.

내 문서에 따르면 C89에서 "%lf"은 잘못된 형식 지정자입니다. C89 컴파일러/구현을 사용하는 경우에는이를 사용하는 정의되지 않은 동작입니다.


scanf에 대한 규칙은 약간 다릅니다.

-1

두 배를 인쇄하려면 %f을 사용해야합니다. %lf은 긴 복식에만 해당됩니다.

+0

감사합니다. 그리고 scanf에서 % lf 대신 % f를 사용해야합니까? – Favolas

+0

'long double '에'% Lf'가 사용됩니다. '% lf'는 C99 표준에 따라 printf에서'% f'와 같아야합니다. – interjay

+1

아니요,'scanf'에서'% f'는'float'을위한 것이고,'% lf'은 두번째를위한 것입니다. ('% llf'을 사용하여 long double을 스캔하십시오.) – asaelr

3

가변 인수 목록에서 float 값은 자동으로 double으로 변환됩니다. charshort 내지 int. 따라서 printfdouble 값 (부동 소수점 값으로 변환 됨)의 경우 %f 만 필요합니다.

포인터가 변환되지 않습니다. 이는별로 의미가 없습니다. 이것이 scanffloat 대상의 경우 %f, double 대상의 경우 %lf을 구별해야하는 이유입니다.

+0

+1은'scanf' ** 포인터 **를 사용하며 기본 인수 판촉을받지 않습니다. – pmg