運行環境 win10 codeblocks 17.12
一、 C++ double類型用 %lf 格式輸出
【輸出錯誤】:-0.000000
二、 C++ double類型用 %f 格式輸出【輸出正確】
三、 C語言 double類型用 %lf 或 %f 格式輸出 【均輸出正確】
這讓我感到十分玄學,爲什麼第一種輸出就不對了呢,double類型爲什麼不能寫%lf輸出?
(編譯器選用 dev c++ 或者 vs code 在C++中按 %lf 輸出double類型均可正確輸出,而codeblocks 17.12選用C++會輸出0.000000)
原因
問:有人告訴我不能在printf中使用%lf。爲什麼printf()用%f輸出double型,而scanf卻用%lf呢?
答:printf的%f說明符的確既可以輸出float型又可以輸出double型。 根據"默認參數提升"規則(在printf這樣的函數的可變參數列表中 ,不論作用域內有沒有原型,都適用這一規則)float型會被提升爲double型。因此printf()只會看到雙精度數。對於scanf,情況就完全不同了,它接受指針,這裏沒有類似的類型提升。(通過指針)向float存儲和向double存儲大不一樣,因此,scanf區別%f和%lf。