-1

コードを見る

#include<iostream.h>
#include<conio.h>
class A{
   private:
      int i;
   public:
      A()
      {
         i=10;
      }
      A operator++(int)
      {
         A tmp=*this;
         i +=1;
         return tmp;  
      }
      display()
      {
         cout<<i;
      }
};
int main()
{
   A a,b;
   b=a++ + a++;
   cout<<endl<<b<<"\t"<<a;
   return 0;
}

ステートメントb = a++ + a++の場合、期待値は 20 になると考えられますが、上記のステートメントの結果は 21 になりました。

どのように?

親切に私を助けてください。

4

5 に答える 5

2

チャールズが指摘した++ように、 A オブジェクトで呼び出されるのは関数呼び出しです。したがって、最初に i を 10 から 11 にインクリメントして 10 を返し、次に 2 回目の呼び出しで i を 11 から 12 にインクリメントして 11 を返します。10 と 11 を加算すると、21 になります。

于 2013-08-29T12:18:12.663 に答える
0

簡単な比較の形で答えを示します。

あなたのコードは次のとおりです。

b = a++ + a++;

私はあなたがむしろそれを混同したと思います:

b = a + (a++)++;
于 2013-08-29T12:52:22.947 に答える
0

オーバーロードされた演算子は、変な名前の関数です。それらは必ずしも組み込みのものと同じように動作するとは限りません。組み込み型のオブジェクトで同じ式を実行したい場合は、実行しないでください。動作は未定義です。

operator+あなたはforの定義を示していませんA- 私はそれが自由な関数であると仮定します. 式は次のb = a++ + a++;ように書き直すことができます。

b = operator+( a.operator++(0), a.operator++(0) );

物事をより明確にするのに役立つことを願っています。

postfix increment への 2 つの呼び出しの順序は不定です。つまり、どちらが最初に呼び出されるかはわかりません。どちらも同じオブジェクトで呼び出されますが、特定の順序に依存しないため、あなたの場合は問題ではありません。プログラムの同じ実行中であっても、一貫している必要はありません。

于 2013-08-29T13:38:43.690 に答える