6

私の疑問は、 (Alt in ) でのIncrement/Decrement演算子 ( ++and --)の使用についてです。プログラムでandを使用することは絶対に必要ですか? たとえば、以下のコードを考えてみましょう。CC++++--

int x=10;
x++; 

これは、次のように簡単に置き換えることができます。

int x=10;
x=x+1;

では、実際のプログラミングで++andを使用する必要はありますか? --特定の理由でこれを求めています。私の意見では、これらは で最も紛らわしい演算子の 1 つであり、、などCの式を形成し、毎日何千ものエラーを引き起こしています。*x++++*xx++ + ++x

もちろん++、 とアセンブリ命令の間の直接マッピングINCRが可能であることは知っています。しかし、最適化する能力を備えた適切なコンパイラは、 に置き換えることができると思いx=x+1ますINCR x

要するに、私の質問は「x=x+1 が x++ を置き換えることができない状況はありますか?」です。

++またはがないと機能しないコードを誰かが提供できれば、非常に役立つかもしれません--

助言がありますか?ありがとうございました。

4

7 に答える 7

11

x = x + 1交換できない状況はありますx++か?

確かに、foo(x = x + 1)は とは異なります。foo(x++)なぜならx = x + 1、 は の新しい値をx生成x++し、 は の古い値を生成するからですx


それ以上の違いはあまりなく、厳密++には必要ありません (つまり、すべてのプログラムをの代わりにとの代わりに--書くことができます)。x += 1++xx -= 1--x

C++ ではoperator++andoperator--をオーバーロードすることができ、イテレータを操作するときに特に便利であることに注意してください。

于 2013-05-19T13:34:55.993 に答える
4

省略形の演算子 (++、--、+=、-=、*= など) の主な利点は、オペランドを繰り返す必要がないことです。これは大したことではありません

x = x + 1; 

xが と同じ変数であることは簡単にわかりますx。しかし、どうですか:

ptr->kerflunk->var.arr[x+y+z*w+i] = ptr->kerflunk->var.arr[x+y+z*w+i] + 1;

それはどのくらい違うのですか:

ptr->kerflunk->var.arr[x+y+z*w+i] = ptr->kerflunk->var.arr[x+y-z*w+i] + 1;

あなたが見た場合:

ptr->kerflunk->var.arr[x+y+z*w+i]++;

この後者の場合、同じことであることが非常に簡単にわかります。

(はい、私は極端な例を作成していますが、これは、複雑な構造のいくつかのビットにいくつかの一時変数を使用することなどによって改善される可能性が非常に高い可能性があり++ます。 ")

私は、C と C++ が優れた初心者向け言語だとは思いません。C と C++ の初期の部分を、 、 、 などを使用せずに教えてもまったく++問題--あり+=ませ-=x = x + 1

[そしてもちろん、お望みであれば、C/C++ を使用して混乱させても、有効にコンパイルできるものにすることができます。構文的には有効ですが、 2 つのシーケンス ポイント間で 2 回a[x = x + 1] = b[x = x + 1];使用した場合と同じ問題が発生します]。x++

于 2013-05-19T14:04:09.347 に答える
3

イテレータ。

x = x + 1は、x に任意の数を追加できることを意味しますが、特定のタイプの x には当てはまらない場合があります。

イテレータの場合。

前方イテレータはインクリメントのみ可能で、双方向イテレータはデクリメントも可能ですが、数値を追加することはできません。プログラマーの観点からは、効率的なコンテナー アクセスを強制する可能性があるためstd::list::begin() + 65536、何かを使用したくなることはありません。

一方、ランダム アクセス iteratorでは、反復子に対する算術演算が可能です。

- 編集 -

絶対に必要か

絶対に必要な言語機能はありません。

C++ の場合、stl、名前空間、クラス、プリプロセッサ、テンプレート、ローカル変数、例外、および関数呼び出しを取り除くことができ、それでも何かを実行する作業プログラムを生成できます。もちろん、このプログラムはほとんど読めず、書くのに時間がかかりますが、それは可能です。基本的に、プログラムする必要があるのは、goto、配列、グローバル変数、ターミナルとの間で文字を読み書きする関数だけです。それ以外はすべて技術的にオプションです

言語機能は、htme なしでは生きていけないからではなく、あなたの生活を楽にするために作られています。++/-- 演算子に関しては、前方/双方向反復子や、前/次のセマンティクスをサポートするが、任意の引数によるインクリメント/デクリメントをサポートしないその他のデータ型を実装するのに最も役立つようです。

于 2013-05-19T14:04:03.970 に答える