cの同じステートメントの同じ変数にインクリメンタとデクリメンタを設定できますか?
単一の変数に複数の前置インクリメント/デクリメント演算子を使用できることを発見しましたが、後置は 1 つだけです。
元:
++--++foo; // valid
foo++--++; // invalid
--foo++; // invalid
どうしてこれなの?
cの同じステートメントの同じ変数にインクリメンタとデクリメンタを設定できますか?
単一の変数に複数の前置インクリメント/デクリメント演算子を使用できることを発見しましたが、後置は 1 つだけです。
元:
++--++foo; // valid
foo++--++; // invalid
--foo++; // invalid
どうしてこれなの?
これは、C ++(Cではない)では、の結果が++x
lValueであるという事実によるものです。つまり、割り当て可能であり、したがってチェーン可能です。
ただし、の結果はx++
lValueではなく、prValueです。つまり、に割り当てることができないため、チェーンすることはできません。
C ++言語では、プレフィックスのインクリメント/デクリメント演算子は左辺値を返し、ポストフィックスの演算子は右辺値を返します。一方、すべての変更演算子には左辺値引数が必要です。これは、プレフィックスのインクリメント/デクリメントの結果を、左辺値引数を必要とする他の追加の演算子(追加のインクリメント/デクリメントを含む)に渡すことができることを意味します。
C ++でもまったく同じ理由で、次のようなコードを記述できます。
int i = 0;
int *p = &++i;
これはインクリメントi
し、をp
ポイントしi
ます。単項&
には左辺値のオペランドが必要です。これが、プレフィックスの結果で機能する理由です++
(ただし、ポストフィックスの結果では機能しません)。
同じオブジェクトに複数の組み込みプレフィックスインクリメント/デクリメントが適用された式は、未定義の動作を生成しますが、それでも整形式(つまり「コンパイル可能」)です。
++foo--
C ++では、接尾辞演算子は接頭辞演算子よりも優先されるため、のような式は無効です。中かっこはそれを変えることができます。たとえば、(++foo)--
は整形式の式ですが、再び未定義の動作につながります。