このコードブロックについて説明してください:
void main()
{
int t,
a = 5,
b = 10,
c = 15;
t = (++a && ++b, ++a), ++a || ++c; // need explanation for this line
printf("%d %d %d %d", t, a, b, c);
}
このコードブロックについて説明してください:
void main()
{
int t,
a = 5,
b = 10,
c = 15;
t = (++a && ++b, ++a), ++a || ++c; // need explanation for this line
printf("%d %d %d %d", t, a, b, c);
}
コンマ演算子はその 2 番目のオペランドの結果を返し、||
演算子は短絡します。したがって、この場合は次のようになります。
++a
評価されて、a
現在は未使用品6
です。
(1) の結果が非ゼロだったので、 の右側&&
が評価されます。ということは++b
、そうb
なる11
。
(1) と (2) はカンマ演算子の左側なので、結果&&
は破棄されます。(それ1
があなたにとって重要であれば、それはです)。
最初の++a
右側,
が評価されます。 a
です7
。
への代入t
が行われます -t
は今7
、最初のコンマ演算子の結果です。
それはすべて別のカンマ演算子の左側だったので、結果 ( 7
) は破棄されます。次に++a
評価です。 a
です8
。
a
は 0 ではないため、短絡||
し、++c
は評価されません。c
とどまります15
。
結果: t
is 7
、a
is 8
、b
is 11
、およびc
is 15
。printf
ステートメントは次を出力します。
7 8 11 15
全体として、このコードは、次のように記述した方が理解しやすいでしょう。
++a;
++b;
t = ++a;
++a;
これはまったく同じ動作をします。