• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:valatile と多重代入の関連)

volatileと多重代入の関連

このQ&Aのポイント
  • C言語において、多重代入と呼ばれる方法があります。
  • 多重代入の代入先がハードウェアのポートの場合、通常volatile修飾が付けられます。
  • ただし、異なる処理系では挙動が異なることがあります。

質問者が選んだベストアンサー

  • ベストアンサー
  • ballville
  • ベストアンサー率47% (233/487)
回答No.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])に書き込」んだ処理系の方が忠実ではないでしょうか。

garousia
質問者

お礼

コメントありがとうございます。 >代入演算子の値は代入後の左オペランドの値ですから、 であれば、非volatile変数のa=b=c=0; が、実は c=0;b=c;a=b; の最適化の結果c=0;b=0;a=b; になっており、 volatileは最適化を抑止しますから *(REGS [1]) = *(REGS [2]);を実行するほうが理にかなっているようですね。すっきりしました。 ありがとうございました。

関連するQ&A