2017-10-04 15 views
-1

なぜ以下の違いがありますか?x = * p ++と* p ++の違いは何ですか; x = * p in c?

program001.c:

int main (void) 
{ 
    int a=3,*p,x; 
    p=&a;  
    *p++; 
    x=*p 
    printf("a=%d, *p=%d, x=%d\n",a, *p, x); 
    return 0; 
} 

result: a=3,*p=21974,x=21974 

Program002.c:

int main (void) 
{ 
    int a=3,*p,x; 
    p=&a;  
    x=*p++; 
    printf("a=%d,*p=%d,x=%d\n",a,*p,x); 
    return 0; 
} 

result:a=3,*p=3,x=3 

program001の結果のために、それは理解することができます:*のp ++未定義の値をポイントであるので、それは無理な結果です。

program002の結果は、program001と等しくないのはなぜですか?実施例1から

+0

演算子の優先順位と結合性を調べてください。 –

+0

「x」への代入に関してインクリメントがいつ発生するかを考えてください。 '* p ++'と '* ++ p'の違いも考慮してください。 –

+5

また、* pがインクリメントされた後の* pがどこを指しているか考えて、[*未定義の動作*](https://en.wikipedia.org/wiki/Undefined_behavior)について学んでください。 –

答えて

4

*p++; 
x=*p; 

は、実施例2から

*p; // dereference p and ignore the value. Valid as p points to a 
p++; // increment p 
x=*p; // dereference p and assign the value to x. Invalid as p no longer 
     // points to an int object 

のように書き換えることができる:

x = *p++; 

x = *p; // dereference p and assign the value to x. Valid as p points to a 
p++;  // increment p 
のように書き換えることができます。

例1では、の後にxが割り当てられます。例2では、​​ pがインクリメントされる前にx に代入します。どちらの例にも未定義の動作があります。 print文の*pのためにpが参照されていないにもかかわらず、intオブジェクトを指していないにもかかわらず、pがインクリメントされました。例1では未定義のビヘイビアが既に発生していますx=*p;

0

2つのプログラムの動作の点からは違いはありません。どちらのプログラムも、すべての制御パスで未定義動作を持っています。したがって、両方のプログラムがクラッシュしたり、停止したり、無限に実行したり、何かを印刷したり、何も印刷したりすることはできません。

関連する問題