2016-09-17 74 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 - '行詳細說明了什麼? – 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