2012-08-15 98 views
1

我的程序下面給出該程序的輸出:我無法理解

#include<stdio.h> 
main() 
{ 
    int x=30,*y,*z; 
    y=&x; 
    z=y; 
    *y++=*z++; //what does this mean? 
    x++;   
    printf("%d %d",y,z); 
    return 0; 
} 

什麼是這句話的含義:*y++=*z++

+0

'y'和'z'都指向'x',所以你給自己分配'x'。然後你增加兩個指針。然後通過傳遞給'printf'來引起未定義的行爲,但是使用'%d'轉換,它需要'int's,而不是指針(打印指針,將它們轉換爲'void *'並用' p')。 – 2012-08-15 06:58:30

+0

@JerryCoffin我在這件事上很生疏:即使它們超出分配的空間,它是否合法? – cnicutar 2012-08-15 06:59:21

+4

@cnicutar:是的。只要不取消引用指針,就可以指向一個超過數組末尾的位置(C99,第6.5.6/7節):「對於這些運算符而言,指向非對象的指針一個數組的元素的行爲與指向一個長度爲1的數組的第一個元素的指針相同,該元素的類型爲對象的類型。「 – 2012-08-15 07:03:11

回答

3

它等同於:

*y = *z; 
y++; 
z++; 

我無法理解這個計劃

你打印指針的輸出,沒有太多的瞭解。


  • 您應該使用的%p代替%d打印時,指針
  • 你超越已知的宇宙中,當你增加這些指針
0

這是一樣的:

*y = *z; 
++z; 
++y; 
0

這只是分配對象poi的值yz指向的對象相同,然後遞增兩個指針。

0

它將簡單地將由y指向的對象的值分配給由z指向的對象的值,最後它增加兩個指針。

3

yz是指針,並表達y++z++正在使用的後綴運算符,所以分配後兩者的增量會發生

本聲明3兩件事:*y = *z

  1. 分配給值由y相同的值由z指出指向。
  2. 遞增y指針。現在y指向內存中的下一個int
  3. 遞增z指針。現在z指向內存中的下一個int

如果yz是會後聲明中使用的最後兩個將是壞:yz現在指向不屬於該代碼未初始化的內存。

+0

後綴運算符的優先級高於*。那麼它會不會先增加z指針然後解除引用? – Ram 2012-08-15 10:26:04

+0

對不起,我得到了這個。後綴運算符的效果只有在執行完指令後才能感受到。感覺愚蠢的現在! – Ram 2012-08-15 13:56:51

0

變量yz是指向整數,並且在這種情況下,指向變量x的地址。

以下行將y的值設置爲地址x(即,&x給你`x)的地址。

y=&x; 
z=y 

下一行,*y++=*z++;並不完全意義和可能會或可能不會編譯取決於所使用的編譯器。在GCC 4.3.2的情況下,會出現以下錯誤。

foo.c:7: error: invalid operands to binary * (have ‘int *’ and ‘int *’) 

它看起來像你試圖做指針算術,但得到了運算符的優先權有點混淆。在將預增值分配給某個位置之後,您是否嘗試增加z指向的值?

+0

由於錯過了分號「z = y」的分號, – Ram 2012-08-15 13:21:39

1

*y++=*z++; - 這只是將存儲在指針z中的值分配給*y。在此之後,其遞增yz指針。在此陳述之後,解除引用zy可能會導致崩潰(未定義的行爲)。

這一種說法的字符串複製實現,則使用

void my_strcpy(char *dest, char* src) 
{ 
    while((*dest++ = *src++)); 
} 
0
*y++=*z++; //wat does this mean? 

未定義行爲上述結果(多重修改的下一個序列點之前)。