float型別在值傳遞過程中出現的問題

2021-07-09 12:41:57 字數 1135 閱讀 5957

標籤: 標頭檔案

float

2013-04-01 14:44

211人閱讀收藏 

舉報

程式設計中發現

float

型別資料在跨檔案的值呼叫中會發生異常。舉例如下:

test.c

[cpp]view plain

copy

void

a(float

x1)   

void

b(float

x1)   

main.c

[cpp]view plain

copy

#include 

intmain()  

執行輸出結果是乙個奇大無比的數字

若新建標頭檔案test.h,在標頭檔案中宣告一下這兩個函式

[cpp]view plain

copy

void

a(float

x1);  

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型別

float型別做為引數傳遞過程中出現的問題

程式設計中發現 float 型別資料在跨檔案的值呼叫中會發生異常。舉例如下 test.c cpp view plain copy void a float x1 void b float x1 main.c cpp view plain copy include intmain 執行輸出結果是乙個奇...

busybox在make編譯過程中出錯

前四步為busybox安裝過程,第5步為上述問題的解決方法 2.在makefile中修改arch arm和 cross compile 你自己的交叉編譯工具鏈的路徑 bin arm none linux gnueabi 3.make menuconfig進行配置 這一步的前題是你的ubuntu系統裡...

office 2007在安裝過程中出錯

之前安裝了精簡版office2007,想要裝個專業版使用access。刪了精簡版之後安裝不上專業版,都是安裝過程出錯。困擾很久,網上發現了這個方法解決了。到網上搜尋了一下大致以下幾種解決方案 1,可能是因為c program files common files microsoft shared w...