-4

本とここでは、インクリメントとデクリメント演算子の優先順位が三項演算子よりも高いことを前提としていますが、なぜ以下のコードでは、b と c の両方の値がインクリメントされず、b だけがインクリメントされます (または c はインクリメントされます)条件は false)

int a=1,h;
h = (a==1)?++b:++c;
printf("%d%d",b,c);

または次のようなステートメントについても

++i&&++j||++k;   // why not all the increment and decrement operator executes first

私が概念的な間違いを犯している場合は説明してください。初心者すぎて申し訳ありません(これが重複している場合は、元の質問にリダイレクトしてください。見つかりませんでした)

4

4 に答える 4

2

C11 6.5.15条件演算子p4h = (a==1)?++b:++c;を参照してください(私の強調

最初のオペランドが評価されます。その評価と、2 番目または 3 番目のオペランド (評価される方) の評価の間には、シーケンス ポイントがあります。2 番目のオペランドは、最初の比較結果が 0 でない場合にのみ評価されます。3 番目のオペランドは、最初の比較結果が 0 の場合にのみ評価されます

++bこれにより、との 1 つだけが実行されるという観察++cが正しいことが確認されます。

++i&&++j||++k;C11 セクション 6.5.13、6.5.14 を参照してください。論理 OR 演算子と AND 演算子はどちらも左から右に評価され、結果が判明するとそれ以降の式の評価はスキップされます (したがって、式が に対して非ゼロと||評価されると、式が に対してゼロと評価されると&&)。

于 2013-07-15T12:07:44.970 に答える
1

三項演算子は、条件オペランドとたまたま真であるオペランドのみを評価します。あなたの場合の++c部分はまったく評価されません。

2 番目のケースでは、すべてのオペランドが評価されるわけではありません。これは、||and&&演算子がいわゆる「ショートサーキット」を行うためです。つまり、式全体で結果を変更する機会がなくなった場合、残りのオペランドは評価されません。

于 2013-07-15T12:07:52.913 に答える
0

優先順位は評価の順序を制御しません。. 演算子とオペランドをグループ化する方法のみを制御します。

||および演算子はどちらも&&左から右への評価を強制し、どちらも「短絡」演算子です。式の値が左側の式から決定できる場合、右側の式はまったく評価されません。

したがって、次のような式が与えられます

a++ || b++ && c++

の結果がa++ゼロでない場合、 の結果に関係なく結果は true になるb++ && c++ため、右辺はまったく評価されません。

于 2013-07-15T14:28:19.587 に答える