2016-04-15 11 views
-3

まず、この質問がこのフォーラムでこれまでに質問された場合は、お詫び申し上げます。私は検索しましたが、同様の問題は見つかりませんでした。Cのプレインクリメントとポストインクリメント

私はチュートリアルを進んでいて、コードを見つけました。解決策はわかりません。ここで

はコードがある -

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

int main() 
{ 
    int i=3, j, k; 

    j = PRODUCT(i++); 
    k = PRODUCT(++i); 

    return 1; 
} 

私は、コンパイラによってコードを実行しようとした "J = 12" と "K = 49" のような溶液を得ました。

#defineの仕組みを知っています。これはPRODUCT(x)のすべての出現を(x * x)で置き換えますが、私が把握できないのは、jとkの値がそれぞれ12と49であることです。

ご協力いただければ幸いです。

ありがとうございます。

+0

NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOK! –

+1

'私は検索しましたが、同様の問題は見つかりませんでした。本当に? –

+1

「私はjとkがどのように値を得ているか把握できません」 - どちらもあなたのコードなので、あなたは良い会社です。したがって、未定義の振る舞い*の性質。 – WhozCraig

答えて

4

あなたのコードは、未定義の動作を呼び出します。なんでも起こる可能性がある。文

j = PRODUCT(i++); 
k = PRODUCT(++i); 

マクロはxは、2つの配列点間回以上変更されている両方の文で

j = x++ * x++; 
k = ++x * ++x; 

に拡張されます。

+1

...それは私の 'Rep-PersonalServicesWorker of the Month' bookmanrksに入っています。 –

+0

@MartinJames;もうすでに質問にあなたのコメントがあります。それはとにかく攻撃的です。 – haccks

関連する問題