2
#include <stdio.h>
#include <math.h>

int main(void){

   printf("%lf\n", pow(1.0, 2.0));
   printf("%f\n", pow(1.0, 2.0));

   return 0;    
}

最初printf()は output を返します0.000000が、2 番目printf()は output を返します1.000000。なんで?

Windows 7 64 ビットでのコードブロックの使用。

gcc コマンドを使用してコンパイルすると、両方のステートメントで 1.000000 を出力する .exe が得られます。

コードブロックで F9 キーを押してコンパイルすると、最初のステートメントで 0.000000 が得られ、2 番目のステートメントで 1.000000 が得られます。

最後に、#include <stdio.h>Codeblocks のソース コードから削除すると、すべてが 1.000000 になります (警告やエラーは発生しません)。

4

1 に答える 1

4

コードは、C99 または C11 コンパイラで両方の行に同じ値を出力する必要があります。へのすべてのfloat引数printfは常に に変換されdouble、両方とも同じことを行います (出力 a %lf) 。%fdouble

C89 標準では、%lf指定子は未定義の動作であり、doubles は でのみ出力する必要があり%fます。C99 標準をサポートしていない古いコンパイラを使用している可能性があります。

に関する規格の関連セクション%lf:

C99、7.19.6.1/7:

l (エル) [...] は、後続の a、A、e、E、f、F、g、または G 変換指定子には影響しません。

C89、4.9.6.1:

[...] 後続の d 、 i 、 o 、 u 、 x 、または X 変換指定子が long int または unsigned long int 引数に適用されることを指定するオプションの l (エル)。後続の n 変換指定子が long int 引数へのポインターに適用されることを指定するオプションの l。[...] h 、 l 、または L が他の変換指定子と共に表示される場合、動作は未定義です。

于 2017-12-21T15:15:30.053 に答える