わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

増分・減分演算子は取扱注意

*pa++;を実行すると,まずpa++が実行され,*paによりポイント先のデータを参照するようだ.
(ここが変だよC言語〈上〉, p.202)

書き方の問題なのですが,上記では「*paにより『pa++が実行されたあとのpaの値を使って』ポイント先のデータを参照する,と読めてしまいます.これだと,*++pa;と変わりません.
規格を調べてみました.
JIS X 3010:2003, 6.5.2.4 (p.54)には,「後置++演算子の結果は,そのオペランドの値とする.結果を取り出した後,オペランドの値を増分する」とあります.
++とポインタが混在する式では,++を用いない式に置き換え*1ながら,「何に対して1増やすか?」「いつ1増やすか?」を理解すれば,間違いが減ると思われます.
以下の引用もみな,上記と同じページからです.

++*pa;は,*paによりポイント先のデータを参照し,++を実行している.

ここも,この文だけでは,何に対して「++を実行している」かがつかみにくいです*2
繰り返しになりますが,「*pa++;」,「*++pa;」,「++*pa;」の違いを説明するにあたり,それぞれの++演算子オペランドが何なのかを確認するのが,不可欠でしょう.

改めて演算子の優先順位を確かめると,++は*より高い優先順位を持つようだ.

多くの書籍で,同じ優先順位としてto prioritize them equally記載されています.
構文を見ると(例えば『C言語によるプログラミング―スーパーリファレンス編』p.171),前置++と単項*は同じ箇所で記載されています.後置++は単項*より上位にありますが,評価方法(意味)はすでに述べた通りです.

しかし,世の中の多くのプログラムで当たり前のように*pa++;と書かれている例をよく見かける.

個人的にあまり好きではなく,授業でも教えている年と教えていない年があるのですが*3,世の中どんなもんか,自分なりに調べてみました.

*1:慣れなければテキストエディタや紙の上で,慣れれば頭の中で.

*2:この前のページのプログラムと実行例を合わせて参照することで,「ポイント先のデータ」と分かるのですが

*3:ポインタ変数pに対して「p++;」とすると,pの値を除いてデータは変わらないけど,pを中心とした視界(どこにどんな値が格納されているか)が変わることは,強く教えています.

*4:https://sec.ipa.go.jp/download/dl.php?filename=report/200606/CMGuide_V1-0.pdf は,その前身と思われます.