このポストインクリメント演算子の使用は混乱します。and&or演算子を使用したポストインクリメント演算子の作業におけるdiffrence
{int a=0,b=1,c=2,d;
d=a++||b++||c++
printf("%d %d %d %d",a,b,c,d);}
出力はc
の
1,2,2,1
値は増加しなかったが、私は&&
オペレータに置き換える場合、それは増加です。どうして? C11
を引用
このポストインクリメント演算子の使用は混乱します。and&or演算子を使用したポストインクリメント演算子の作業におけるdiffrence
{int a=0,b=1,c=2,d;
d=a++||b++||c++
printf("%d %d %d %d",a,b,c,d);}
出力はc
の
1,2,2,1
値は増加しなかったが、私は&&
オペレータに置き換える場合、それは増加です。どうして? C11
を引用
、章§6.5.14、(強調鉱山)ビット単位|
オペレータは異なり
、
||
オペレータ保証左から右への評価。 第2オペランドが評価される場合は、最初の の評価と第2オペランドの評価の間にシーケンスポイントがあります。 第1オペランドが0
と等しくない場合、第2オペランドは と評価されません。
だから、あなたの場合には、
d=a++||b++||c++
が
その後d= ((a++ || b++) || c++)
と同じであり、最初の括弧内の文は、最初a++
(ポストインクリメント)を評価し、評価されます0(副作用保留中)であるため、最初の||
のRHSが評価され、b++
が生成され、1が生成され、||
操作の結果TRUEならば1を返します。
その結果、1
は、2番目の||
のLHSです。したがって、第2の||
(c++
)のRHSはもはや評価されず、最終結果は真となり、1
を返し、これはd
に格納されます。
だからは、最終的に、
a++
は、評価1b++
が評価されるとなり、2c++
を評価ないでなる、||
の結果が格納されている2d
で、それは真ですので、1を格納します。、論理AND演算子&&
ため、
[...]第一オペランドが0と等しい場合、第二 オペランドは評価されません。
ですから、&&
との最後の||
を交換した場合、その後、外側のfor文、LHSは1になり、RHSは、副作用として、c++
が評価され、インクリメントされるようになって、評価されます。
@Olafですが、この場合はUBではありません。すべてが異なる変数です。 –
しかし、なぜこれはオペレータには当てはまりませんか? –
@SanyaPandey:あなたは事実上、「どのように '||'と '&&'演算子が働くのか」と尋ねます。両方の演算子の説明をお読みください。あなたはすべての良いCの本やオンラインで簡単な検索でそれを見つけるでしょう。答えを見つけるためには、少なくともあなた自身の努力が必要であることに注意してください。 – Olaf
@Olaf Sir、私は尊敬しています。これは、それだけではなく、欺瞞ではありません。 –
@SouravGhosh:そうかもしれない、私はミッドリーディングをすることができます。しかし、 "演算子"がどのような意味を持つのかは明確には分かりません。あなたの編集は論理的な "and"を意味し、今私は同意する傾向がありますが、最初にOPからの説明を求めた方が良いでしょう(編集前、私はdup-voteの前です)。私は別のdupがあると確信していますが、私のところは本当に間違っています。 – Olaf
これは論理的な "and" –