- 示例: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