天天看點

為什麼printf()用%f輸出double型,而scanf卻用%lf呢?

  •  示例:double x;scanf(“%f”,&x);輸入“123.4”,輸出x的值結果為0,沒有接收輸入的資料,再輸入别的資料,結果都為0。這是因為使用者定義x為雙精度型資料,而用“%f”格式輸入資料,仍不能接收,應該使用“%lf”或“%le”,即scanf(“%lf”,&x);此時輸入“123.4”即可接收。是以長整型資料和雙精度型資料必須使用附加格式說明字元l,短整型資料必須使用附加格式說明字元h。

為什麼printf()用%f輸出double型,而scanf卻用%lf呢?

答:printf的%f說明符的确既可以輸出float型又可以輸出double型。 根據"預設參數提升"規則(在printf這樣的函數的可變參數清單中 ,不論作用域内有沒有原型,都适用這一規則)float型會被提升為double型。是以printf()隻會看到雙精度數。

對于scanf,情況就完全不同了,它接受指針,這裡沒有類似的類型提升。(通過指針)向float存儲和向double存儲大不一樣,是以,scanf差別%f和%lf。

下表列出了printf和scanf對于各種格式說明符可以接受的參數類型。

格式 printf scanf
%c int char *
%d, %i int int *
%o, %u, %x unsigned int unsigned int *

(續)

格式 printf scanf
%ld, %li long int long int *
%lo, %lu, %lx unsinged long int unsigned long int *
%hd, %hi int short int *
%ho, %hu, %hx unsigned int unsigned short int *
%e, %f, %g double float *
%le, %lf, %lg n/a double *
%s char * char *
%[...] n/a char *
%p void void **
%n int * int *
%% none none

(嚴格地講,%lf在printf下是未定義的,但是很多系統可能會接受它。要確定可移植性,就要堅持使用%f。)

PS: scanf 函數中隻有“域寬”附加格式說明字元(指定輸入資料所占列數),而沒有“小數位數”附加格式說明字元(隻有printf函數有)。

原文連結:https://blog.csdn.net/wlx65003/article/details/50396909