C では、2 つの式の値が異なるため、i++
通常は と同等ではありません。これらは同じ式の値を生成するため、 と同等です。i=i+1
++i
i=i+1
前述の 3 つの式 with のいずれの値もi
使用されていない場合、3 つの値は同じです。優れたコンパイラであれば、 によって生成された未使用の一時変数を最適化できますi++
。
この一時変数i++
は、次の 2 つのことを指示するため、有効になります。
- の元の値は
i
式によって返されますi++
i
1インクリメントされます
最初に の元の値を取得して i
から をインクリメントi
すると、 の元の (古い) 値はi
、現在インクリメントされている variable に存在できないため、どこかに存在する必要があります (メモリまたはレジスタは関係ありません) i
。それが一時変数です。
OTOH、最初に1ずつインクリメントi
した場合、インクリメントを元に戻すために(レジスタまたはメモリ内の)どこかに等しい値を作成する必要があるi-1
ため、古い(前にインクリメントされた)値を次の結果として取得できます。表現i++
。
++i
と を使用すると、i=i+1
物事ははるかに簡単になります。これらの式は、次の 2 つのことを義務付けています。
i
増加する
- の新しい値
i
が返されます
i
ここでは、最初にインクリメントしてからその値を取得するのが自然です。i
and i+1
(またはi-1
and i
) の古い値と新しい値のペアを持つ必要はありません。ここで必要なのは新しいことだけです。
現在、コンパイラの最適化があまり得意ではなかった時代の古い本や古い人がいます。i++
そこから、より遅いかもしれないという考えを得ることができます++i
。違いは実際に観察されたものであり、補われたものではありません。それは現実であり、今日でもそうであると考える人もいるかもしれません。
また、2 つ (3 つ) のインクリメント式の違いを分析してみると、いくつかの余分な操作を実行し、i++
. そしてこの時点で、その人は、この一時的なものがいつ必要でないか、または必要かどうかを検出する方法を理解できない可能性があります. これは、前述の違いに関する質問の別の可能性です。
そしてもちろん、人々は昔からトローリングが大好きでした。:)
コンパイラ開発者が怠け者であるということについては...私はそうではないと思います。理由は次のとおりです。
昔は、コンピューターは現在よりもはるかに遅く、搭載する RAM もはるかに少なくなっていました。
それでもまともな最適化コンパイラを書くことは可能でした。
問題は、最適化のための余分なコードがコンパイラを著しく大きく遅くしていたことです。それが大きければ、それを実行できるコンピューターは少なくなり、それを使用してコードをコンパイルできるプログラマーも少なくなります。他のコンパイラよりも遅い場合、人々は座って待っているのが嫌いなので、他のコンパイラを好むでしょう。
適例:私。私は 90 年代半ばに Borland の Turbo C/C++ にアクセスできました。しかし、私は 90 年代後半から 0 年代前半まで、C を学習して使用することを考えていませんでした。理由?Borland の C/C++ は Pascal よりもはるかに遅く、私の PC はあまり良くありませんでした。コードがコンパイルされるのを待つのは苦痛でした。そして、それがその方法でした。私は最初に Pascal を習得し、後で C と C++ に戻ってきました。
そのため、より賢く、より大きく、より遅いコンパイラーは、コンパイラーのユーザーにお金と時間を費やしていました。最終製品が別のコンパイラでコンパイルされたとしても、少なくともアクティブな開発中は、まだ非常に重要な製品段階です。
また、当時の初歩的なツールを使用して大きなコンパイラ コードを開発および管理することもあまり楽しくなかったことを忘れてはなりません。デバッガー、構文の強調表示、オートコンプリート、ソース コード管理、簡単なファイル比較、インターネット/StackOverflow などを備えた優れた IDE (そして 1 つではありません!) を使用できるようになったのは、今だけです。複数の 20 インチ以上のディスプレイが PC に接続されました! 今、私たちは生産性について話しています! :)
本当に、今日は素晴らしいツールとデバイスを手に入れました。20、30、40 年前、人々はそれらを想像または予測することしかできず、まだ使用していませんでした。
物事はより困難でした。そして、ここで明言するつもりはありませんが、プログラミングが現在ほどコモディティ化されていなかった当時、今日よりも優秀で優秀なプログラマーが多かったことを知っても驚くことではありません。もちろん、これは絶対的な数値ではなく、相対的な数値です。
したがって、コンパイラ担当者が怠け者だったとは思えません。
と呼ばれるものについては、Web を調べてくださいSmall C
。これは、C 言語の最も重要な機能のみを実装する、機能を大幅に削減した C コンパイラの一般的な用語です。Ron Cain
, (80 年代初期) によるいくつかの実装と、それらからの派生物 (たとえば、およびJames Hendrix
による同じ RatC/Lancaster 実装)を見つけることができます。Bob Berry
Brian Meekings
これらのいずれかのコードを見るとSmall C's
、最小コード サイズが 2+ KLOC で約 50+ KB であることがわかります。これは、C からアセンブリ コードへの変換にすぎません。ある時点で、誰かがアセンブラでそれを組み立てる必要があります。
最大 48KB の RAM を搭載でき、CPU は ~3MHz で動作する 8 ビットの家庭用コンピューター、たとえば ZX-Spectrum (私が子供の頃に持っていた) のようなもので、このようなプロジェクトで快適に作業することは想像できません。すべてのストレージはテープ レコーダーにあり、データ転送速度は 10KB/分程度で、画面は 80x25 ではなく 32x24 でした。
そして、80 年代初頭の Small C コードはすべて、コンピューターのメモリにかろうじて収まり、何も最適化しませんでした!