2012-02-15 7 views
5

私はそこにいます。C倍精度の結果をdouble doubleで返します

私は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); 

を変更されました

期待どおりに動作します。何故ですか?ダブルスはlfでフォーマットされていませんか?

答えて

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'はdoubleのためです。 ( '%llf'を使用してlong doubleをスキャンする) – asaelr

3

可変引数リストでは、floatの値は自動的にdoubleに変換されます。 charおよびshort~int。したがって、printfdouble値(float値が変換される値)の場合には%fだけ必要です。

ポインタは変換されません。これはあまり意味がありません。これは、なぜscanffloatターゲットと%lfdoubleターゲットの区別する必要がある理由です。

+0

+1は 'scanf' **ポインタ**を使用し、これらはデフォルト引数のプロモーションの対象にはなりません。 – pmg

関連する問題