2016-08-29 5 views
0

なぜ* x = * x + 1;のようにすることができますか?* x = * x ++;何の影響もないようですか?C++ポインタをインクリメントする

コード:

// Example program 
#include <iostream> 
#include <string> 

using namespace std; 

void doSomething(int *x, int *y) 
{ 
    *x = *x++; 
    *y = *y + 5; 
} 

int main() 
{ 
    int x = 4; 
    int y = 3; 
    doSomething(&x, &y); 
    cout << "x is now: " << x << endl; //outputs 4 
    cout << "y is now: " << y << endl; //outputs 8 
    return 0; 
} 
+2

、あなたがしている「事をインクリメントすることは、ポインタで指さ」。 –

+0

'++ * x'を試してみてはどうですか? –

+0

なぜこれが投票されたのか分かりません。私はこのビデオの横についていた@ 31:25は、上記のコードへの参照です: https://www.youtube.com/watch?v=Rxvv9krECNw – simon

答えて

2

*x = *x+1; 

はもちろん

*x = ++*x; 

のように書くことができます。この文では、あなただけ書くことができ

++*x; 
この文のよう

*x = *x++; 

それは

*x = *(x++); 

に相当し、ポストインクリメント演算子の副作用が配列決定されていないため、未定義の動作をしています。

+0

* x = ++ * x;働いた。ありがとうございました。 – simon

+0

'* x = ++ * x'もUBです。 –

+0

@OliverCharlesworth間違っています。 –

2

dereference *演算子より後置演算子++の方が優先順位が高くなります。ステートメント*x = *x++;は、次のように実行されます*x = (*(x++))

ご覧のとおり、++のように、ポインターがポイントしていた位置にポインターを移動します。そこから、dereference演算子が実行されます。あなたが実際の値xを増分したい場合は、++*x;

+1

'x ++ 'の表現結果は' x'の元の値です。 –

-1

と書いてください。すべての式がoperators precedence ruleに従うからです。

あなたがテーブルで見ることができるようにオペレータoperator++あなたがより良い括弧に従うことができoperator*

よりも優先順位が高い、コード:

*x = *(x++); 

*x = *x++; 

は同等です

つまり、の後にポインタの値をインクリメントしてにするそれを言いなさい。

メモリでは、何かが起こる:とにかく、それはゴミだ、

| x = 4 |  
| trash |  <---- &x+1 
| trash | 

そして自分自身にその値を代入して:あなたは、メモリ内の次のセルを指しますポインタをインクリメント

| x = 4 |  <---- &x 
| trash | 
| trash | 

を。


ミス理解する有効な助けなければなりません括弧の使用を避けるために、ソリューション

はでそれを修正:あなたは「ポインタのインクリメント」していない

*x = ++(*x); 
+0

'* x =(* x)++;'そして今は*別の*問題があります。 '(* x)++;はどうでしょうか? –

+0

@BoPerssonあまりにも高速ですが、私は –

+0

を修正しました_ "あなたはポインタの値を増やしています。本当?増分は、割り当ての前後に発生する可能性のある副作用です。私の理解は、 '* x ++'は常に 'x'の元の位置を逆参照し、後で' x'は次の位置を指すように移動することです。だから結果は未定義ですか?ゴミ箱の場所に4の値が割り当てられている可能性がありますか? – wally

関連する問題