0

次のプログラムは、floatを読み取り、整数を出力することになっています。しかし、実行すると、整数は出力されません。代わりに、入力した値を出力しますscanf。誰かが出力を説明できますか?

#include<stdio.h>
void main()
{
    long x;
    float t;
    scanf("%f",&t);
    printf("%d\n",t);
    x=90;
    printf("%f\n",x);
    {
        x=1;
        printf("%f\n",x);
        {
            x=30;
            printf("%f\n",x);
        }
    x=9;
    printf("%f\n",x);
    }
}
4

4 に答える 4

3

tは typefloatを持っているため、 type の引数を期待するため、未定義の動作printf("%d\n",t)を呼び出します。何でも起れる。(同じことが:にも当てはまりますが、 の型はです。)%dintprintf("%f\n",x)%fdoublexlong int

私は一度、それらのケースの 1 つに詳細に答えました。おそらくそれは興味深いものです。つまり、実際には、IEEE754 浮動小数点数の構造を研究し、プラットフォーム上の整数型のサイズを知ることで、観測された動作を説明できるということです。

于 2012-08-15T13:17:52.020 に答える
1

次のように、変数を出力する%dときに使用する必要があります。int

printf("%ld", x);

を使用して%fいます。

于 2012-08-15T13:18:40.863 に答える
1
printf("%f\n",x);

xタイプlongは ですが、%fコンバーターは (タイプ の) 浮動小数点値を想定していdoubleます。通常、浮動小数点値を予期する関数に整数を渡すと、値はサイレントに変換されます。ただし、これは、固定数の引数と、各引数の型を示すプロトタイプを持つ関数にのみ適用されます。などの可変引数関数には適用されません。これはprintf、コンパイラが値を何に変換するかを知るのに十分な情報を持っていないためです。書式文字列は実行時にのみ分析される可能性があります。

言語仕様では、このプログラムの動作は定義されていません。何でもできます。この場合、おそらく起こっていることxは、整数レジスタにf格納され、浮動小数点レジスタに格納されていることです。printf呼び出しは浮動小数点値を探しているため、コンパイルされたコードは最初の浮動小数点レジスタを調べます。に浮動小数点値を渡した場合printf、引数はそのレジスタに格納されます。しかし、あなたはそうしなかったので、そのレジスタの値はそこに格納された最後の値でした: によって読み取られた値scanfです。

優れたコンパイラは、何か間違ったことをしていると警告します。たとえば、コードをコンパイルすると、次のようになりますgcc -O -Wall

a.c:2: warning: return type of 'main' is not 'int'
a.c: In function 'main':
a.c:7: warning: format '%d' expects type 'int', but argument 2 has type 'double'
a.c:9: warning: format '%f' expects type 'double', but argument 2 has type 'long int'
a.c:12: warning: format '%f' expects type 'double', but argument 2 has type 'long int'
a.c:15: warning: format '%f' expects type 'double', but argument 2 has type 'long int'
a.c:18: warning: format '%f' expects type 'double', but argument 2 has type 'long int'

このような警告を出力するようにコンパイラを構成し、注意を払うことをお勧めします。

プログラムを動作させるには、浮動小数点値が期待される場所に浮動小数点値を渡すかprintf、整数値を期待するように指示します。また

printf("%f", (double)x);

また

printf("%ld", x);
于 2012-08-15T13:26:18.860 に答える
0

x は長整数ですが、浮動小数点数として出力しています。t は float ですが、整数として出力しています。printf 呼び出しで %d と %f の書式指定子を切り替えます。

于 2012-08-15T13:17:51.287 に答える