4

次の C コードを実行しています。

#define cube(x) (x*x*x)
void main()
{   
    int x=2,y;   
    y=cube(++x);            
    printf("%d %d",++x,y);    
}

私は結果を期待しています

6,60

しかし、それは異なる結果をもたらしています。プリプロセッサについて誤解していると思います。コードは次のようになると思います

void main()
{   
    int x=2,y;   
    y=++x*++x*++x;            
    printf("%d %d",++x,y);    
}

間違っている場合は修正してください。

結果が 3*4*5=60 になると解釈しています
が、125 になっています。

4

4 に答える 4

5

提示された翻訳が正しいように、単純な文字列置換として機能するマクロを定義しました。

ただし、部分式の実行順序は定義されておらず、たとえばインターリーブされる可能性があり、これにより未定義の動作が発生します。

于 2012-04-26T08:36:07.530 に答える
-1

++x*++x*++xは の値を3 倍にx増やします。つまり、 の値がx5に割り当てられます。5*5*5 = 125出力も同様です。この値も、コンパイラのアーキテクチャによって異なります。

于 2012-04-26T10:42:42.703 に答える
-1

このプログラムの出力は、部分式の実行順序に依存するため、コンパイラ、オペレーティング システム、さらには同じコンパイラのバージョンによっても異なります。
Visual Studio でコンパイルした場合: o/p は 125 です。gcc
でコンパイルした場合: o/p は 80
です。したがって、出力を予測することはできません。
そして、インタビューで人々がなぜこの種の質問をするのか(明確な結論がないもの)はわかりませんか?

于 2012-04-26T10:27:22.573 に答える
-1

プリプロセッサは、与えられた式を取得するため、C コードの場合、最初は x=2 であり、マクロの実行中に、

最初に 2 つの値を使用して乗算し、次に 3 番目の値を結果と乗算するため、シーケンスは次のようになります。

++x * ++x => 3 (最初のインクリメント)、4 (次のインクリメント)、式によると、x の値は 4 になります。

4 * 4 => 16,

繰り返しますが、次のインクリメント x => 5 であるため、式の結果によると、

16 * 5 => 80

したがって、乗算の結果の合計は 80 になり、x の値は 5 になります。

于 2012-04-26T09:23:37.800 に答える