ネギ式

適当に生きるおっさんのブログ

C++で後置インクリメントを書いてしまう

ロートルプログラマだから。なんか炎上しそうな気もするから書きたくない気もするんだけど。そもそも読者が少ないから炎上しようがないよね。

基本的に、理屈じゃなくて手が勝手に動いてしまうんだよ。ロートルプログラマだから。

まず、後置インクリメントが悪いと言われる理由を一応私なりに理解している範囲で書く。後置インクリメントは状態をなんからの意味でインクリメントし、変更前の値を返す。前置インクリメントは、状態をなんらかの意味でインクリメントし、変更後の値を返す。そして、インクリメント演算子はこの二つしかない。つまり、状態をインクリメントするだけという演算子はない(そんなものがあったとしても演算子とは言えない)。

ところが、プログラムを書く上では、状態をインクリメントしたいが値はいらないという状況がままある。そういう時に、後置インクリメントを使うと効率が悪いだろうということだ。

これはC++固有の問題である。いや、C++と同様に演算子オーバーロード出来るオブジェクト指向言語は同様の問題を持つとも言えるが、少なくともCやJavaでは起こらない。Cはオブジェクト指向ではなく、整数に対する後置インクリメントの非効率なんて最適化で消えてしまう。(関係ないけど、常識ある大人は浮動小数点数をインクリメントしたりしないものだ)Javaは、素晴らしいことに、演算子オーバーロードがない。

じゃあ、なぜ俺は後置インクリメントを書いてしまうのかというと、K&Rなどの書き方でC言語を学んだからに他ならない。ロートルなので癖を直せないのである。そうは言っても、速度以外にC++を使う理由はないので、効率の悪い後置インクリメントは使わない。つまり整数と本来のポインタにしか後置インクリメントは使わないので、俺に関する限り効率の問題はない。

Vectorとかのクラスも使ってない。使ってるのはstreamとstringとshared_ptrくらいだ。shared_ptrはネームスペースの変更でダメージを受けた。テンプレートは使う。これは速度に大きく影響するから、そしてクラス階層を使わないためにテンプレートを使う必要があるから。

もしC++が++Cに名前を替えたら後置ではなく、前置インクリメントを使うかもね。だいたい、C++ってCから一歩も前進していないのだよ。だって、C++を参照した時に返ってくる値は、変更前の値なのだから。

というように愚痴を言いたくなるのは、今日C++のプログラムを書いていたからに他ならない。なんともかんとも。