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拡張です)i
i
これは次のように解析され c = (i) && (&&i)
ます。// 括弧は、人間が読めるようにするためのものです。
&
variable のアドレスが得られますi
。この質問で数分前に尋ねたばかりです。
ラベルのアドレスと値の詳細については、この gcc 拡張機能を参照してください。
編集:&&
論理ANDは常にステートメントの短絡に従います。したがって、最初のケースでは0
、見つかったので(論理式の2番目の部分)にi=0
は行きません。&&i
しかし、その後のすべてのケースでは、そうでi
はなく、ラベルのアドレスである次の式に移動します(そして、アドレスのアドレスは常に に評価されます。)0
TRUE
&&i
i
i
TRUE
したがって、 isの最初のケースを除いて、完全な式の結果は常にTRUE
meansになります。したがって、あなたは結果を見ています1
i
0
0
1
1
値としてのラベルの使用はgcc
拡張です (こちらを参照)。あなたの表現セグメント:
c = i &&&& i;
c = i && (&&i); は&&i
ラベルのアドレスですi
。
ここでは、2 つのまったく異なるi
「オブジェクト」を組み合わせていることに注意してください。1 つ目はi
を循環する変数で0, 1, 2
、2 つ目はラベルi
で、アドレスは常にゼロ以外の値です。
つまり、C に配置された結果は、変数が0
の場合にのみ (false) になります。そのため、シーケンスを取得しています。 i
0
0, 1, 1
余談ですが、私の部下が本番用にこのようなコードを購入した場合、「従業員管理の実践」について真剣に考えます。このような怪物の可能性を排除するものは、私の意見では良いことです:-)