私が読んでいる次のコードがあります:
if( (i%2) == 0 ){
*d = ((b & 0x0F) << 4);
}
else{
*d++ |= (b & 0x0F);
};
私は特にelse
声明を見て、これがどのような順序で発生するのか疑問に思っていますか?私は通常のCコンパイラを持っていないので、これをテストすることはできません。私たちが演奏しているとき*d++ |= (b & 0x0F);
、これはどのような順序で起こりますか?
私が読んでいる次のコードがあります:
if( (i%2) == 0 ){
*d = ((b & 0x0F) << 4);
}
else{
*d++ |= (b & 0x0F);
};
私は特にelse
声明を見て、これがどのような順序で発生するのか疑問に思っていますか?私は通常のCコンパイラを持っていないので、これをテストすることはできません。私たちが演奏しているとき*d++ |= (b & 0x0F);
、これはどのような順序で起こりますか?
d
++は、に割り当てられている左辺値ではなく、ポインタに適用されます*d
。
あなたが本当にしたいのであれば、あなたはそれを次のように考えることができます:
b
はビット単位であり、定数とAND:edです。0x0f
d
れます。d
は、次の値を指すようにインクリメントされます。d ++は、インクリメントされる前のdの値を返します。次に、これは*によって逆参照され、その場所が|=が実行される場所になります。したがって、dをインクリメントする前の場所のデータには、(b&0x0F)が組み込まれます。
一般に、コード行の操作の順序が一目で明確でない場合は、その行を構成要素の操作にリファクタリングします。生成されたコードは、多くの操作を1行のCに詰め込むだけでは、高速になったりコンパクトになったりすることはありません。このようにわかりやすさを犠牲にする正当な理由はありません。行を次のように置き換えます
*d |= (b & 0x0F);
d++;
最初にの右側の部分|=
が実行され、次に*d |=
割り当てが行われ、次にd
インクリメントされます。通常、そのような質問を引き起こすコードがある場合は、わかりやすくするためにコードを書き直す必要があります。
++
の前に発生します|=
。代入演算子は、優先順位チャートの下部にあります。
++
最初に行われます。ただし、ポストインクリメント(つまりd++
ここ)はこれと同等(temp=d, d++, temp)
です。
http://www.cppreference.com/wiki/operator_precedenceによると
(b&0x0F)を評価し、| =を適用して*bに割り当て、最後に*bが指す値をインクリメントします。
式は次の*d++ |= (b & 0x0F)
ように分類されます。
*d++
とはそれぞれ1回評価されます(評価される順序は指定されていません。結果は評価が行われる順序に依存しないためb & 0x0F
、コンパイラーはb & 0x0F
前に自由に評価できます)。*d++
(b & 0x0F)
はビット単位です-または*d++
;の結果と一致します。d
が更新されます。式は;*d++
として解析されます。*(d++)
つまり、式の結果を間接参照していますd++
。式はの現在の値にd++
評価され、次のシーケンスポイントの前の不特定のポイント(この場合はステートメントの終わり)で、の値が更新されます。更新の副作用をすぐに適用する必要はありません。割り当ての前または後に発生する可能性があります。 d
d
d