5
int main()
{
        int i, c;
i:
        for (i = 0; i < 3; i++) {
                c = i &&&& i;
                printf("%d\n", c);
        }
        return 0;
}

を使用してコンパイルされた上記のプログラムの出力は次のとおりgccです。

0
1
1

上記のプログラムでcはどのように評価されますか?

4

2 に答える 2

28

この場合、 および としても解析され&&ます&&。最初のものはですlogical ANDが、2番目はvariable のアドレスではなく、&&labelのアドレスです。(gcc拡張です)ii

これは次のように解析され c = (i) && (&&i)ます。// 括弧は、人間が読めるようにするためのものです。

&variable のアドレスが得られますiこの質問で数分前に尋ねたばかりです。

ラベルのアドレスと値の詳細については、この gcc 拡張機能を参照してください。

編集&&論理ANDは常にステートメントの短絡に従います。したがって、最初のケースでは0、見つかったので(論理式の2番目の部分)にi=0は行きません。&&i

しかし、その後のすべてのケースでは、そうでiはなく、ラベルのアドレスである次の式に移動します(そして、アドレスのアドレスは常に に評価されます。)0TRUE&&iiiTRUE

したがって、 isの最初のケースを除いて、完全な式の結果は常にTRUEmeansになります。したがって、あなたは結果を見ています1i0

0
1
1
于 2012-12-19T07:12:58.167 に答える
25

値としてのラベルの使用はgcc拡張です (こちらを参照)。あなたの表現セグメント:

c = i &&&& i;

c = i && (&&i); は&&iラベルのアドレスですi

ここでは、2 つのまったく異なるi「オブジェクト」を組み合わせていることに注意してください。1 つ目はiを循環する変数で0, 1, 2、2 つ目はラベルiで、アドレスは常にゼロ以外の値です。

つまり、C に配置された結果は、変数0の場合にのみ (false) になります。そのため、シーケンスを取得しています。 i00, 1, 1

余談ですが、私の部下が本番用にこのようなコードを購入した場合、「従業員管理の実践」について真剣に考えます。このような怪物の可能性を排除するものは、私の意見では良いことです:-)

于 2012-12-19T07:18:25.933 に答える