[英]why is this behaviour of strtof() changes with respect to the change in stdlib.h?
在包含<stdlib.h>
的情況下,以下代碼給出123.34
的輸出。
#include<stdlib.h>
int main()
{
char *str="123.34";
float f= strtof(str,NULL);
printf("%f",f);
}
但是如果沒有<stdlib.h>
它將產生33.000000的輸出。
<stdlib.h>
在這里的作用是什么,為什么在代碼中無處顯示33.00000值?
您必須查看編譯器生成的警告。
warning: implicit declaration of function 'strtof' [-Wimplicit-function-declaration]
這仍然會產生結果,無論如何都不是確定性的,因為期望的返回類型為float
,而如果不包含標頭,則默認為int
。
如果您查看stdlib頭文件 ,就會有一個聲明,
float strtof(const char *restrict, char **restrict);
通過#include<stdlib.h>
,我們提供了此聲明。 錯過時,編譯器會假定要返回int
,因此結果不確定。 在我的系統中,它的輸出為0.00000000
,而在包含必要的包含項之后,我的輸出為123.339996
。
作為預防措施,養成始終使用-Wall
選項(假設您正在使用gcc)或更佳的-Werror
選項來編譯代碼的習慣。
<stdlib.h>
標頭告訴編譯器strtof()
返回float()
; 在沒有它的情況下,編譯器被迫假定它返回一個int
。 現代的C編譯器(GCC 5及更高版本)抱怨strtof()
的聲明不存在和/或其內部存儲的strtof()
聲明存在沖突。
如果省略<stdlib.h>
,則代碼在C99和C11中是不可接受的,因為在使用它之前沒有聲明strtof()
。 由於省略了<stdio.h>
,因此在C90中無效,更不用說C99或C11了。 您必須先聲明可變參數函數,例如printf()
然后再使用它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.