2016-09-17 8 views
2

次のコードは、yを大整数として出力します.15ではありません。なぜか分からない。私は--++演算子が*演算子の前に来ることを知っているので、動作するはずです。C - インクリメントおよびデクリメントポインタ

以下のコードは何を言おうとしていますか。

/* 
Create a variable, set to 15. 
Create a pointer to that variable. 
Increment the pointer, into undefined memory space. 
Decrement the pointer back where it was, 
then return the value of what is there, 
and save it into the variable y. 
Print y.  
*/ 

int main() 
{ 
    int x = 15; 
    int *test = &x; 
    test++; 
    int y = *test--; 
    printf("%d\n", y); 

    return 0; 
} 

代わりにした場合、私は次のようにコードを変更します。

int main() 
{ 
    int x = 15; 
    int *test = &x; 
    test++; 
    test--; 
    printf("%d\n", *test); 

    return 0; 
} 

コード出力15こと。どうして?

+2

'test - 'は評価されていない値を評価するので、 '* test - 'はla-la-landを指すポインタを逆参照します。 '* - test'を使用した場合、それは問題ありません。 –

+0

@JonathanLefflerしかし、プログラムが '* test - 'に出会ったら、まず 'test - 'を実行してから '* test'を実行します。私は ' - 'が '*'の上に存在するということを読んでいます。そうでない場合、正確に '* test - 'の行で何が起こっているのでしょうか? – Hatefiend

+0

@Hatefiendだから、 'y'は' x'からsizeof(int)を差し引いたアドレスになります。 – Jezor

答えて

5

差はx++++xの間であり、ポインタのポストインクリメントとプリインクリメントです。

  • ++x後になると、古い値が++x前である場合には、新しい値をインクリメントした後に使用される前に、インクリメント
  • に使用されています。

これは動作します:

int y = *(--test); 

括弧は必要ありませんが、明確にするためにそれらを使用することをお勧めします。

+0

興味深い。ポインタが指しているところの*値*をインクリメントしたいのですが?例えば、 'int x = 15;' 'int * y =&x;' '(* y)++;' 'printf("%d \ n "、* y); //期待されるプリント:16' – Hatefiend

+0

@Hatefiendはい、ポインタを指し示しているポインタ、増分するものをコンパイラに知らせるためにかっこを使用します。 – dasblinkenlight

関連する問題