2012-02-15 61 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.2lf", change); 

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

它按預期工作。這是爲什麼?雙打未格式化爲lf?

回答

5

"%f"double S(和float S的被轉換爲double自動地); %Lf用於long double s。 您可以閱讀關於C99 Standard(或PDF)中printf說明符的全部內容。

在格式說明"%lf"l沒有效果:"%lf"(同"%f")是打印double秒。

你的結果應該和任何理智的C99編譯器/實現一樣。

根據我的文檔,在C89中,"%lf"是無效的格式說明符;如果您使用的是C89編譯器/實現,則使用它的是未定義行爲。


請注意,scanf的規則有點不同。

-1

您應該使用%f打印雙打。 %lf僅適用於長時間雙打。

+0

謝謝。而在scanf我應該使用%f而不是%lf? – Favolas 2012-02-15 16:36:08

+0

'%Lf'用於'long double'。根據C99標準,'%lf'應該與printf中的'%f'相同。 – interjay 2012-02-15 16:37:04

+1

'scanf'中的編號,'%f'只用於'float','%lf'用於雙精度。 (使用'%llf'來掃描長雙精度) – asaelr 2012-02-15 16:37:39

3

在可變參數列表中,float值自動轉換爲double; charshortint。因此,printf只需要%f,double值(將浮點值轉換爲的值)。

指針不轉換 - 這沒有多大意義。這就是爲什麼scanf需要區分%ffloat目標和%lfdouble目標。

+0

+1用於引用'scanf'需要**指針**,這些不受默認參數促銷。 – pmg 2012-02-15 17:56:29