2017-10-24 15 views
3

私は、後置インクリメントおよびデクリメント演算子がオペランドのの右辺値を返すことを読んだ。この可能性のようなコードであるか、それが本当であると仮定すると?:ポストフィックスインクリメントポインタへの割り当て

int arr[5]{}; 
int *p = arr; 
for (int i = 0; i != 5; ++i) 
    *p++ = i; 

私の思考proceesするオペレータも優先による

  1. で、*pが最初に評価されます。
  2. そして、後置インクリメントは値をインクリメントし、オブジェクトのコピーとしてを返します。
  3. 代入演算子の左辺に値が入るべきではないので、私は混乱します。 したがって、私の質問は基本的には:どのように*p++ = i;が可能ですか?

答えて

1

オペレータも優先によると、*pは最初に評価されます。

あなたは間違っています。 documentationによれば、増分が最初に評価される。これは右辺値(つまり、ポインタがインクリメントされる前の値)を返します。逆参照された後は左辺に割り当てられます。

+0

もちろん、ああ。私はドット演算子と逆参照演算子が混在しています。今はばかげているようだ。ありがとう。 –

+0

素敵な答えJodocus、私より1分早く! @ ZylonD.Lite、彼の答えを受け入れることを忘れないでください*。 – gsamaras

+1

もちろん!完了しました。 –

2

オペレータの優先順位に従って、* pが最初に評価されます。

間違っています。ここで

*p++ 

増分は*p最初に評価、およびないであろう。

これは右辺値(ポインタの値)を返し、逆参照の後では、これはiに割り当てることができる左辺値になります。

あなたはこれにループのためにあなたを書き換えることができます:より良いビューを取得するために

for (int i = 0; i != 5; ++i) { 
    std::cout << *p << std::endl; 
    *p++ = i; 
    std::cout << *p << std::endl; 
} 

+0

ええ、私の悪いです。長い夜。ありがとう。 –

関連する問題