javascript
1 var t = 0; 2 console.log('0',t++); 3 console.log('1',t)
上記の後置演算子は、三行目で1になります。
仕様と言われればそれまでなのですが、なぜ計算前の値を代入してから加算するのでしょうか。
また後置演算子はどのようなときに利用価値を見いだせるのでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
ベストアンサー
以下は偏見が混じった非常に個人的な見解です。間違っている可能性もありますので、曇り無き眼で批判的に読むことをお勧めします。
後置であろうが前置であろうがJavaScriptにおいてインクリメント演算子++
とデクリメント演算子--
は不要な物であると考えています。その理由を説明してきます。
JavaScriptでのインクリメント演算子/デクリメント演算子の由来はC言語になると思います(もしかしたら、その前のB言語やBCPLになるかも知れませんが、それらの言語の詳細を知らないため、ひとまずC言語にします)。
C言語が作られた当時、コンパイラを作る技術は未熟でした。コンパイル時の最適化などできるはずもなく、C言語はいかに機械語に翻訳しやすいか(=コンパイラを作りやすいか)を重視して作られました。つまり、C言語の命令と機械語がなるべく1対1になれば、簡単に翻訳できるようになります。たとえば単純に1を足す命令を考えます。その場合、C言語においてもx = x + 1;
と書いても問題なく動きます。しかし、この命令は少なくとも「xに1を足す」と「足した値をxに代入する」という二つの命令から成り立ちます。となると、機械語に翻訳したときに少なくとも二つの命令からなります(実際はレジスタへの移動とかありますので、少し異なります)。しかし、ほとんどの機械語にはインクリメント命令とデクリメント命令が用意されていました。単純に1足すだけであればインクリメント命令一つだけで済むはずであり、二つの命令にしなければならないというのは遅くなる原因です。しかし、当時の未熟な技術ではx = x + 1;
となっている部分をインクリメント命令に最適化して翻訳することができませんでした。そこで、インクリメントやデクリメントに関しては++
と--
という特別な演算子を別に用意して、プログラマがなるべく速くなるコードを書けるようにしました。(あくまで、私の個人的な見解ですので、間違っているかも知れません。なお、現在のコンパイラは最適化が非常に優秀なため、たぶん、同じコードになることでしょう。)
この伝統のインクリメント演算子/デクリメント演算子はC言語を拡張したC++でも受け継がれました。そして、C++を参考にしてしまったJavaにも受け継がれました。JavaScriptは、その名前にあるとおり、開発の途中で何を血迷ったのかJavaに似せようとしました。JavaにもインクリメントがあるのだからJavaScriptにもあった方がいいだろうという安易な発想の元、インクリメント演算子/デクリメント演算子が実装されました(これも、ただの個人的な見解です)。それが実質ただのx = x + 1
にすぎないとしてもです。ご存じの通りJavaScriptはスクリプト言語であり、言語設計において機械語への翻訳を意識する必要はありません。インクリメント演算子/デクリメント演算子を使ったからと言って速くなるわけではないのです(事実、jsperfで確認する限り、速度の違いはほとんどありません)。
つまり、JavaScriptのインクリメント演算子/デクリメント演算子は当時の流行にあやかろうと安易に言語名にまでつけてしまったJavaの弊害であり、C言語からの負の遺産です。事実、言語設計がしっかりした言語、Python、Ruby、Scalaなどはインクリメント演算子/デクリメント演算子は不要であるとし、実装していません(そんなのはx += 1
と書けば十分短いし、わかりやすい)。言語的な複雑さを産む(複雑な黒魔術を使いたければ、C++をすればいいのです)ばかりで、速度などと言ったメリットは一切得られないからです。
よって、インクリメント演算子/デクリメント演算子は、JavaScriptの暗黒面、つまり、言語としてとても残念になってしまった部分の一つだと私は考えています。結論としては、利用価値は全くありません。
投稿2015/12/09 12:47
総合スコア21741
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/09 13:01
2015/12/09 13:16
2015/12/09 13:25
2015/12/09 13:43
2015/12/09 14:19
2015/12/09 14:33
2015/12/09 15:01 編集
2015/12/09 15:13
2015/12/09 15:44
2015/12/10 11:02