読者です 読者をやめる 読者になる 読者になる

ポストインクリメント不要論

c/c++ Java

何となく巷ではインクリメントがHOTなようだ。
ADDやSUBよりINCやDECの方がサイクルが小さかったんだ、
なんていう話はもうきっと過去の事なのだろう。
Pythonで++xとかx++とかできる?
でも語られる通り、すでに記法の問題なのだなぁ、これは。


と、それとは関係あるようなないような感じで、
過去のJavaHouseのメーリングリストで「ポストインクリメント不要論」なるものを見つけて興味を持った。


要するに「ポストインクリメントは値を評価してからインクリメントをする」という動きをするので、
ソースを読む際に誤解を招きやすく「不要なのではないか?」ということ。

public int next() {
  return buffer[currentIndex++];
}

というメソッドは「カレント位置の値を返してからカレントインデクスを加算する」という動作をするが、
「誤読を誘発する懸念があるため」

public int next() {
  int result = buffer[currentIndex];
  ++currentIndex;
  return result;
}

としたら明確でよりよいのではないか、という趣旨。

やっぱり後置演算子なんて無ければ誰でも同じように書けてよかったのにいという思いが強いです。

という言葉が指し示す通り、
二種の書き方があるということで
前置と後置の評価順の差違は混乱を招く可能性はあるけれども、


単によく使われる演算子の評価順などは基礎知識でもあって覚えれば事足りるとも言える。


ただ確かに「前置」「後置」があることは何となく不可思議でもある。

C++などはクラスによってはoperatorオーバーロードの実装上後置では一時オブジェクトを返さなければならないので
後置++は嫌われており、
効率を重視した結果、前置++を好むことになる。


とすれば少しばかり冗長にはなるが、実際後置演算子は不要とも言えるのかもしれない。
まぁ、ポインタ演算するときは、

int attr1 = *pi++;
int attr2 = *pi++;
int attr3 = *pi++;
int attr4 = *pi++;

なんて書けると短くて良いのですけどもね。

int attr5 = *pi; ++pi;
int attr6 = *pi; ++pi;
int attr7 = *pi; ++pi;
int attr8 = *pi; ++pi;

でも実質は変わらない訳ですが。


と言いつつも個人的には慣れの問題だと思うし、
「whileとdo whileがあるのは〜」くらいのレベルの話だと思うので、


++が後置か前置かで(激しく)Bugった覚えもないので正直「分かってさえいれば」どうでもいい気がする。