簡體   English   中英

為什么strtof()的這種行為相對於stdlib.h的變化而變化?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM