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

2021-07-26 06:29:31 字數 1052 閱讀 2200

程式設計中發現

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

指標做為引數傳遞

如果乙個函式的引數是乙個指標,不能用此指標去動態申請記憶體,include include using namespace std void getmemory char p,int size void test int main void 傳送錯誤是因為 getmemory 函式中申請記憶體的時候...

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

標籤 標頭檔案 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...

GraphQL 引數型別與引數傳遞

2019graphql入門到精通 graphql基本引數型別 graphql基本引數傳遞 type query numdice不能為空,numsides可以為空,返回值為int型別陣列 graphql允許客戶自定義引數型別,通常用來描述想要獲取的資源的屬性。graphiql true 開啟除錯模式 ...