2017-12-07 7 views
1

<stdlib.h>を含めると、次のコードでは123.34の出力が得られます。なぜstdtib()のこの動作はstdlib.hの変更に関して変化しますか?

#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の値がコード内にない場合にはなぜ発生しましたか?

+0

libヘッダーを含め、私のPCに123.34996が届いています。 –

答えて

3

コンパイラによって生成された警告を確認する必要があります。

warning: implicit declaration of function 'strtof' [-Wimplicit-function-declaration] 

これはまだヘッダを含めることなく、デフォルトはintを想定しているのに対し、期待リターンタイプは、floatあるため、どのような方法で確定的でない結果をもたらします。

あなたはstdlib header fileに見れば、宣言があり、#include<stdlib.h>

float strtof(const char *restrict, char **restrict); 

は、私たちはこの宣言を提供しています。見逃した場合、コンパイラはintを返すとみなし、結果は確定的ではありません。 私のシステムでは、出力として0.00000000が生成されましたが、必要なインクルージョンでは、出力として123.339996が得られました。

予防措置として、-Wallオプション(gccを使用していることが前提)を使用してコードをコンパイルすることを習慣にしてください。-Werrorオプションを使用することをお勧めします。

2

<stdlib.h>ヘッダーは、strtof()float()を返します。その不在時にコンパイラはintを返すと仮定しなければならない。最新のCコンパイラ(GCC 5以上)は、strtof()の宣言がないこと、および/またはstrtof()の内部に記憶されている宣言との競合について不平を言っています。

<stdlib.h>を省略すると、コードを使用する前にstrtof()を宣言していないため、コードはC99およびC11では受け入れられません。 <stdio.h>を省略するので、C99ではC99またはC11ではなく無効です。それらを使用する前に、printf()などの可変関数を宣言する必要があります。

関連する問題