-4
#include<stdio.h>
#define square(x) x*x

    void main()
    {
        int i;
        i = 8 / square(4);
        printf("%d %d", i, 8/square(4));
    }

出力を与える: 8 8

しかし、コードの下に書くと:

#include<stdio.h>
#define square(x) x*x

    void main()
    {
        float i;
        i = 8 / square(4);
        printf("%f %f", i, 8/square(4));
    }

出力を与える:8.000000 0.000000

どうしてそんなこと???説明してください

4

6 に答える 6

2

問題はフォーマット指定子だけでなく、マクロの定義方法にもあります。そのはず:

#define square(x) ((x)*(x))

また、マクロはタイプ セーフではありません。4 の 2 乗は 16 であり、8/16 は 0.5 であるため、結果をキャストすると、何が起こっているintかがわかります。

printf("%d %d", (int)i, (int)(8/square(4)));
printf("\n%f %f", (float)i, (float)8/((float)square(4)));

サンプル出力:

0 0
0.000000 0.500000
于 2013-11-13T06:40:23.617 に答える
1

まず、これを修正します。

#define square(x) x*x

#define square(x) ((x)*(x))

マクロ置換後の正しい結果のために。

さて、最初のプログラムでは、他の人が説明したように、間違った書式指定子%fを使用して整数を出力しています (整数8/(square(4)に評価されます)。これは未定義の動作です。

2 番目のプログラムでは、結果を に格納しているため、8/square(4)型が に昇格されます。したがって、あなたは最初の印刷に乗ります。2 回目の印刷では、上記と同じ理由で結果が正しくありません。floatfloat i8.000000

于 2013-11-13T06:36:53.523 に答える
0

前者は分かりやすいので、後者だけに注目します。C コンパイラは 8/square(4) を整数として使用しますが、浮動小数点数を必要とする 2 番目のパラメータに %f を使用します。この不一致により、結果が破損します。

于 2013-11-13T06:13:16.697 に答える
0

8/square(4)結果はundefined behaviorintを使用して整数を出力しようとします。したがって、2 番目のケースで取得した値をデバッグする必要はありません。%f

gcc コンパイラを使用している場合、コマンドcc -E filename.cは疑問を明確にするかもしれません。

于 2013-11-13T06:17:55.993 に答える