++
インクリメント演算子と加算演算子の違いは何+
ですか? +
の代わりに使用できないのはなぜ++
ですか?
/に対する++
/--
演算子の利点は何ですか? それらは正確にどこに適用されますか?+
-
++
インクリメント演算子と加算演算子の違いは何+
ですか? +
の代わりに使用できないのはなぜ++
ですか?
/に対する++
/--
演算子の利点は何ですか? それらは正確にどこに適用されますか?+
-
x++;
対
x = x + 1;
主な利点は、プリインクリメントとポストインクリメントから得られます。
例えば
x = 1;
y = 1;
a = x + 1; // a is 2, x is 1 - e.g. does not modify x
a = ++x; // a is 1, x is 2
b = y++; // b is 2, y is 2
主な欠点は、次のようなものです
a = ++x + x--;
未定義の動作です。完全にコンパイラに依存しており、「バグ」を理解しようとする人にとっては地獄になります。
C 標準による唯一の違いは、 の評価数ですx
。通常の変数の場合、違いは通常問題になりません。x = x + 1
コンパイラがの 2 つの評価でx
同じ値を与えることを証明できる場合、コンパイラはこれを最適化する可能性があります。
たとえばx
、 volatile と宣言されているか、関数の評価が含まれている場合、評価は2 回行う必要があります。例:
unsigned* f(void);
それから
*f() = *f() + 1;
とはかなり異なります
++(*f());
単項演算子(++、-)は主に便宜上存在します。たとえば x++
、書くよりも書くほうが簡単です。x = x + 1
++
'pre-increment'または'post-increment'を実行するためにも使用できます。書き込むx++
と、の値x
が増加し、の元の値x
が返されます。例えば:
int a = 0;
int x = 0;
a = x++; // x is now equal to 1, but a is equal to 0.
と書く++x
と、xはまだインクリメントされますが、新しい値が返されます。
int a = 0;
int x = 0;
a = ++x; // Both a and x now equal 1.
また、通常、コンパイラの実装にもわずかな違いがあります。ポストインクリメント(x++
)は次のようになります。
x
一時変数にコピーしますx
pre-increment(++x
)は次のようになります。
x
x
したがって、プリインクリメントを使用すると、ポストインクリメントよりも操作が少なくて済みますが、現代のシステムでは、これは通常、コードを最適化するための適切な方法であることに価値のある違いはありません。
「++」は「プラスワン」を意味します。例:
int x = 5;
x++; // the same as x = x + 1
cout << x; // will print 6
「+」は既知のプラス演算子です
++
便利な構文です。言語に実際に機能を追加するわけではありませんが、いくつかの一般的な操作をより簡潔に記述する方法が追加されます。
スタンドアロンのステートメントとしてa++;
は、と同じであるa+=1;
と同じですa=a+1
。
a++
他の方法では 2 つのステートメントが必要な場合に、次のような状況で役立ちます。
while (a < N) doSomethingWith(a++);
の短い形式です
while (a<N)
{
doSomethingWith(a);
a=a+1;
}
a++
で書くことができ、で書くこともできないものはないと思いますがa=a+1
、1対1の置換を行うことはできません。a
1 番目の形式は の値を生成し、次に をインクリメントするという 2 つのことを実行するため、2 番目の形式を同等にするために、より多くのコードが必要になる場合がありますa
。a=a+1
フォームはインクリメント後の値を生成するためa
、元の値が必要な場合は、最初にそれを処理する別のステートメントが必要です。
実際には追加を使用できます:
a = a + 1
しかし、ほとんどの人は短いバージョンを好みます。一部の言語では、値を新しい場所にコピーする必要が実際に回避されますが、 nneonneo が有益に指摘したように、C コンパイラがこれを最適化する可能性があります。
インクリメントはレジスタで行いますが、加算は ALU で行います。インクリメントの代わりに + を使用できますが、インクリメントの方が高速です