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はどのように評価されますか?
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はどのように評価されますか?
この場合、 および としても解析され&&ます&&。最初のものはです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
値としてのラベルの使用はgcc拡張です (こちらを参照)。あなたの表現セグメント:
c = i &&&& i;
c = i && (&&i); は&&iラベルのアドレスですi。
ここでは、2 つのまったく異なるi「オブジェクト」を組み合わせていることに注意してください。1 つ目はiを循環する変数で0, 1, 2、2 つ目はラベルiで、アドレスは常にゼロ以外の値です。
つまり、C に配置された結果は、変数が0の場合にのみ (false) になります。そのため、シーケンスを取得しています。 i00, 1, 1
余談ですが、私の部下が本番用にこのようなコードを購入した場合、「従業員管理の実践」について真剣に考えます。このような怪物の可能性を排除するものは、私の意見では良いことです:-)