2012-08-15 99 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? 

未定义行为上述结果(多重修改的下一个序列点之前)。