- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:valatile と多重代入の関連)
volatileと多重代入の関連
このQ&Aのポイント
- C言語において、多重代入と呼ばれる方法があります。
- 多重代入の代入先がハードウェアのポートの場合、通常volatile修飾が付けられます。
- ただし、異なる処理系では挙動が異なることがあります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
C言語の仕様というなら… 代入演算子の結合規則は右から左ですから、 a = b = c = 0; は、 a = ( b = ( c = 0 ) ) ; となります。 このことと、Cでは、代入も値を持つことを考えると、 *(REGS [0]) = *(REGS [1]) = *(REGS [2]) = 0; は *(REGS [2]) = 0 の値を、 *(REGS [1]) に代入し、その値を… ということになります。 で、 *(REGS [2]) = 0 の値は何かといえば、 代入演算子の値は代入後の左オペランドの値ですから、 *(REGS [2]) ということで、 「*(REGS [2])の内容をいったんリードし、それを*(REGS [1])に書き込」んだ処理系の方が忠実ではないでしょうか。
お礼
コメントありがとうございます。 >代入演算子の値は代入後の左オペランドの値ですから、 であれば、非volatile変数のa=b=c=0; が、実は c=0;b=c;a=b; の最適化の結果c=0;b=0;a=b; になっており、 volatileは最適化を抑止しますから *(REGS [1]) = *(REGS [2]);を実行するほうが理にかなっているようですね。すっきりしました。 ありがとうございました。