12

私はプログラミングの初心者ですが、その理由を知りたかっただけです。

このコードを使用する場合:

#include <stdio.h>
int main()
{
 double pi = 3.1415926535897932;
 printf("%lf",pi);
 return 0;
}

コンパイラはこの警告を出します。ISO C90は、'%lf'gnu_printf形式をサポートしていません[-Wformat]

私はubuntuターミナルでgccコンパイラを(-o -Wall -ansi -pedantic-errors)で使用しています

この背後にある理由は何ですか?Webを検索したところ、この使用はC99で許可されていることがわかりました。C90がprintfでの%lfの使用を許可しなかったのはなぜですか?%.16lfまたは%.16fを使用でき、どちらも同じ精度で印刷できます。C90で%lfが悪くなる原因は何ですか?

4

2 に答える 2

8

C90のドキュメントによると:

次のd、i、o、u、x、またはX変換指定子がlongintまたはunsignedlongint引数に適用されることを指定するオプションのl(ell)。次のn変換指定子がlongint引数へのポインターに適用されることを指定するオプションのl。または、後続のe、E、f、g、またはG変換指定子がlongdouble引数に適用されることを指定するオプションL。h、l、またはLが他の変換指定子とともに表示される場合、動作は定義されていません。

于 2013-03-25T12:20:51.377 に答える
5

Cは進化する言語です。新しい機能と動作は、C標準のすべての新しいリリースで追加されます。

C89は、lbeforefが未定義の動作につながると言っています。そしてC90はおそらく同じことを言っています。

一方、C99は、l以前fは効果がないと言っています。

于 2013-03-25T12:23:48.813 に答える