float類型做爲參數傳遞過程中出現的問題

編程中發現float類型數據在跨文件的值調用中會發生異常。舉例如下:

test.c

[cpp] view plain copy
  1. void a(float x1) {  
  2.        printf("%f", x1);  
  3. }  
  4. void b(float x1) {  
  5.        a(x1);  
  6. }  
main.c
[cpp] view plain copy
  1. #include <stdio.h>  
  2. int main(){  
  3.        b(3.3);          
  4. }  
運行輸出結果是一個奇大無比的數字

若新建頭文件test.h,在頭文件中聲明一下這兩個函數

[cpp] view plain copy
  1. void a(float x1);  
  2. void b(float x1);  
在main.c中#include "test.h"
在運行發現輸出恢復正常。得到3.30000


原因:

在你沒有INCLUDE頭文件的時候,編譯器不知道你的函數原型,在生成目標文件時會進行參數推斷,就是根據你調用的情況進行推斷,僅推斷參數個數,參數數據類型會一律推斷爲INT型,之後生成二進制可執行文件時,鏈接器在環境變量指定的目錄或者當前目錄下尋找到匹配的函數定義,進行鏈接,但是之前的MAIN目標文件已經按照INT型進行參數推斷了,所以數據會按照INT型進行存儲和傳遞,最後真正執行時調用printf對一個INT型存儲的數據按照FLOAT型進行輸出,結果是不可預估的。

自己試驗了下,如果參數是3.0,double型輸出就沒問題,如果參數是3,double型輸出就會有問題,輸出了0.00000。所以沒有頭文件的時候,編譯器除了根據參數推斷參數的個數,還會推斷參數的類型,不過浮點型數據會默認爲double型,而不是float型。。。
測試了下,即使參數是3.0f,編譯器也還是會判斷爲double。。。不認作float。。。
所以爲了避免這種問題,最好加上頭文件,或者使用double類型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章