2017-10-04 186 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 ++是指向不確定的狀態,所以這是不合理的結果。

for program002的結果,它爲什麼不等於program001?

+0

請查閱運算符的優先級和關聯性 –

+0

想想增量何時發生與賦值到'x'有關。還要考慮'* p ++'和'* ++ p'之間的區別。 –

+5

同時考慮* p在增加後指向的位置,並瞭解[*未定義的行爲*](https://en.wikipedia.org/wiki/Undefined_behavior)。 –

回答

4

來自實施例1:

*p++; 
x=*p; 

可以改寫爲

*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 

來自實施例2:

x = *p++; 

可以改寫爲

x = *p; // dereference p and assign the value to x. Valid as p points to a 
p++;  // increment p 

因此,在示例1中,在 p增加後,您將其分配給x 。在示例2中,在 p遞增之前,您分配給x

這兩個示例都有未定義的行爲,例如,由於*p在打印語句中,其中p被取消引用,即使它不再指向int對象,因爲p已遞增。在示例1中,未定義的行爲已經發生在x=*p;

0

從兩個程序的行爲來看,沒有區別。這兩個程序在所有控制路徑上都有未定義行爲。因此,這兩種程序都會崩潰,可以停止,可以無限運行,可以打印任何內容或根本不打印任何內容。

相關問題