6

特に、接頭演算子の参照渡しは理にかなっています。オブジェクトに対してさらに操作を行いたい場合に便利です。

しかし、なぜ後置演算子が値を返すように設計されたのか、私には理解できません。

それは単なる慣例ですか、それともこのように設計されたのには正当な理由がありましたか (値による戻り値は後置には意味がありませんが、前置には意味があります)。

誰か説明できますか?

答え

以下の回答のおかげで、後置演算子は必ずしも値で返す 必要はないようです (標準によると)。

ただし、後置演算子のセマンティック要件 (元の値を返しますが、後で元の値への参照をインクリメントする) により、次の標準要件と併せて:

演算子のオーバーロードは関数であるため、すべての副作用は関数が完了する前に発生する必要があります。

以下のDavid Rodriguezによって明確に説明されているように、値の分岐はセマンティック要件の必然的な結果のようです。

このコンテキストでは、他の値を返すため (元の参照ではありません。関数の右中括弧によって変更されるため)、他の値値で返すことが最も理にかなっているようです。

4

4 に答える 4

5

post fix の典型的な実装では、関数に対してローカルな一時オブジェクトを作成し、プレフィックス演算子を使用して最初に渡されたオブジェクトをインクリメントしてから一時オブジェクトを返すため、これが規則です。そのローカル オブジェクトへの参照を返すことはできないため、値で返す必要があります。

ローカル オブジェクトは関数のスコープ内でのみ有効であることが保証されており、このスコープを超えてアクセスすると未定義の動作が発生するため、参照を返すことはできません。

于 2013-02-12T04:37:56.920 に答える
3

確かにそれは正当な理由でした。ポスト インクリメント オペレータは次のことを行います。

  1. 変数をインクリメントし、
  2. 古い値を返します。

変数の「古い値」への参照を返す方法はありません。なくなった。

于 2013-02-12T05:01:46.083 に答える
3

次のコードは、C および C++ で明確に定義されています。

int i = 7;
printf("%i\n", i++ + 2);

これにより、コンソールに 9 が出力されiますが、8 になります。保証されています。

接尾辞のインクリメント/デクリメントは を変更しますが、 の古い値i返します。オブジェクトでこれを行う唯一の方法は、現在の値を新しい値に保存し、自分自身をインクリメントして、保存した値を返すことです。i

于 2013-02-12T04:38:48.187 に答える