2016-11-03 7 views
-4

誰でもこのコードが1 3 0 0 0 -1で印刷され、1 2 3 0 0 0ではないことを私に説明してもらえますか?この定義はどのように働くのですか?このコードは何を印刷し、なぜですか?

#include<stdio.h> 
#define SOMETHINGDEFINED(i) A[i%4] 

int main(void) { 
    int i, A[6] = { 1 }; 
    SOMETHINGDEFINED(1) = 2; 
    SOMETHINGDEFINED(5) = 3; 
    SOMETHINGDEFINED(4 + 2) = SOMETHINGDEFINED(1 + 3 + 1)--; 
    for (i = 0; i < 6; i++) { 
     printf("%d ", A[i]); 
    } 
    return 0; 
} 
+0

4 + 2%4,1 + 3 + 1%4とは何ですか? – immibis

答えて

2

#defineは、テキストの置換を行いますので、

SOMETHINGDEFINED(1 + 3 + 1)-- 

A[1 + 3 + 1%4]-- 

は今、あなたはそれを法だけではない式全体に、最後のオペランドに適用されて見ることができなりました。マクロを

#define SOMETHINGDEFINED(i) A[(i)%4] 

と定義して、式全体に正しく適用する必要があります。

+0

実際、このような仕事があります。それはこのコードが何を印刷するのかを尋ね、それを解決しようとしてからコンパイルし、VSの結果は私のものとは異なっていました。それをデバッグしようとしたので、それを取得しませんでした... まあ、ありがとうジャック! :) – redbaron

1

SOMETHINGDEFINED(4 + 2) = SOMETHINGDEFINED(1 + 3 + 1)--;即ちA[6]=A[5]--;A[5]--は、A[5]、すなわち0の古い値を取得し、それを返すA[4 + 2 % 4] = A[1 + 3 + 1 % 4]--;に変換、次いで割り当てがA[5]A[6]の古い値を割り当て、A[5]を減少させます。

+0

「1 + 3 + 1%4」は5であり4ではないことが幸運です。そうでなければ、_undefined behavior_になります。 –

+0

@RolandIllig私の悪い、あなたは正しい。 – grigor

1

Cでは、マクロは単純なテキストの置き換えです。余分なかっこを入れずに自分で置き換えてください。あるいは、実際にコンパイルせずにCコンパイラのプリプロセスコードを作る方法を調べてください。これは、このトピックを理解するのに十分な情報を提供します。

ところで、このコード例は、Cマクロをできるだけ使用しないでください。

関連する問題