5

私が読んでいる次のコードがあります:

if( (i%2) == 0 ){ 
    *d = ((b & 0x0F) << 4); 
}
else{
    *d++ |= (b & 0x0F); 
};

私は特にelse声明を見て、これがどのような順序で発生するのか疑問に思っていますか?私は通常のCコンパイラを持っていないので、これをテストすることはできません。私たちが演奏しているとき*d++ |= (b & 0x0F);、これはどのような順序で起こりますか?

4

7 に答える 7

11

d++は、に割り当てられている左辺値ではなく、ポインタに適用されます*d

あなたが本当にしたいのであれば、あなたはそれを次のように考えることができます:

  1. の値bはビット単位であり、定数とAND:edです。0x0f
  2. 結果のビットパターンは、を指す値にビット単位でOR:さdれます。
  3. ポインタdは、次の値を指すようにインクリメントされます。
于 2010-05-19T13:08:50.200 に答える
5

d ++は、インクリメントされる前のdの値を返します。次に、これは*によって逆参照され、その場所が|=が実行される場所になります。したがって、dをインクリメントする前の場所のデータには、(b&0x0F)が組み込まれます。

一般に、コード行の操作の順序が一目で明確でない場合は、その行を構成要素の操作にリファクタリングします。生成されたコードは、多くの操作を1行のCに詰め込むだけでは、高速になったりコンパクトになったりすることはありません。このようにわかりやすさを犠牲にする正当な理由はありません。行を次のように置き換えます

*d |= (b & 0x0F); 
d++;
于 2010-05-19T13:11:30.850 に答える
2

最初にの右側の部分|=が実行され、次に*d |=割り当てが行われ、次にdインクリメントされます。通常、そのような質問を引き起こすコードがある場合は、わかりやすくするためにコードを書き直す必要があります。

于 2010-05-19T13:09:50.480 に答える
2

++の前に発生します|=。代入演算子は、優先順位チャートの下部にあります。

于 2010-05-19T13:13:08.047 に答える
0

++最初に行われます。ただし、ポストインクリメント(つまりd++ここ)はこれと同等(temp=d, d++, temp)です。

于 2010-05-19T13:12:16.637 に答える
0

http://www.cppreference.com/wiki/operator_precedenceによると

(b&0x0F)を評価し、| =を適用して*bに割り当て、最後に*bが指す値をインクリメントします。

于 2010-05-19T13:14:09.440 に答える
0

式は次の*d++ |= (b & 0x0F)ように分類されます。

  1. *d++とはそれぞれ1回評価されます(評価される順序は指定されていません。結果は評価が行われる順序に依存しないためb & 0x0F、コンパイラーはb & 0x0F前に自由に評価できます)。*d++
  2. の結果(b & 0x0F)はビット単位です-または*d++;の結果と一致します。
  3. ビットごとの演算の結果は、元々dが指していた場所に格納されます。
  4. このすべてのある時点で、の値dが更新されます。

式は;*d++として解析されます。*(d++)つまり、式の結果を間接参照していますd++。式はの現在の値にd++評価され、次のシーケンスポイントの前の不特定のポイント(この場合はステートメントの終わり)で、の値が更新されます。更新の副作用をすぐに適用する必要はありません。割り当ての前または後に発生する可能性があります。 ddd

于 2010-05-19T13:42:08.233 に答える