* y ++和++ * y之间的区别?

时间:2013-07-31 18:39:02

标签: c pointers pointer-arithmetic

我对如何执行此代码感到困惑。假设我们有

int x=30,*y,*z;
y=&x;

* y ++和++ * y之间有什么区别?以及该计划的产出是什么?

#include<stdio.h>
int main(){

    int x=30,*y,*z;
    y=&x;
    z=y;
    *y++=*z++;
   x++;
   printf("%d %d %d ",x,y,z);
   return 0;
}

4 个答案:

答案 0 :(得分:9)

表达式x = *y++的效果与:

相同
x = *y;
y = y + 1;

如果表达式只是*y++;(没有赋值)那么它只与y++;相同,那就是y在增量后开始指向下一个位置。

第二个表达式++*y表示增加y指向的值,与*y = *y + 1;相同(指针不递增) 回答第一个问题会更清楚:

假设您的代码是:

int x = 30, *y;
int temp;
y = &x;

temp = *y++; //this is same as:  temp = *y;  y = y + 1;

首先将*y分配给temp变量;因此temp分配了30,然后y的值增加1,它开始指向x的位置之后的下一个位置(实际上没有变量存在)。

下一个案例:假设您的代码是:

int x = 30, *y;
int temp;
y = &x;

temp = ++*y;  //this is same as *y = *y + 1; temp = *y;

*y30然后31的{​​{1}}增量的第一个值已分配给31(注意:temp现在是{ {1}})。

问题的下一部分(阅读评论):

x

答案 1 :(得分:6)

  

*y++++*y之间有什么区别?

C中表达式的含义有两个特征:它产生的 value 以及它产生的副作用

让我们检查第一个表达式。

后缀增量优先于解除引用,因此这是*(y++)

后缀增量会产生副作用:它会将y的值更改为指向其他位置。后缀增量也会产生一个值:y在递增之前的值。然后*运算符取消引用该值以生成左值:也就是说,您可以将其用作变量,以存储到或从中获取。

我注意到副作用可能在解除引用之前或之后的任何时候发生。如果你说

q = *y++ 

然后++的副作用可能在任何时候发生。这可能是:

q = *y;
y = y + 1;

或者它可以被视为

t = y;
y = y + 1;
q = *t;

两者都完全合法。 (当然,如果y本身是一个带有副作用的表达,那么这些副作用必须只产生一次。为了清楚起见,我将在整个过程中做出这个假设。)

++*y怎么样?这很简单:*y生成一个变量,变量的内容递增,表达式的值是递增的值。请注意,副作用可以无序生成:

q = ++*y

可以视为:

t = *y + 1;
*y = t;
q = t;

t = *y + 1;
q = t;
*y = t;

请记住, C对副作用可能发生的顺序没有太多限制,所以要小心。

答案 2 :(得分:5)

  

* y ++和++ * y之间有什么区别?

如果表达*y++*z++;因为后缀版本++优先于*,编译器将其视为;

*(y++) = *(z++);

如果是++*y;编译器将其视为++(*p),它将首先递增它指向的对象的值(在这种情况下为x),然后返回其递增的值。

其他可能性的汇总表;

Expression                 Meaning
-------------------------------------------------------------------------------------
*y++ or *(y++)         Value of expression is *y before increment; increment y latter
(*y)++                 Value of expression is *y before increment; increment *t later
*++y or *(++y)         Increment y first; value of expression is *y after increment
++*y or ++(*y)         Increment *y first; value of expression is *y after increment

编辑正如Eric Lippert在他的评论中指出的那样:表达式的值在递增之前是*y,之后递增y 是误导,我想在此澄清我使用后者之后来强调上一个下一个*y分别用于表达式 注意,副作用可以以任何顺序产生,或者副作用首先产生,后者赋值,或者先分配值,后者产生副作用。有关详细信息,请阅读答案: - 12Eric Lippert

答案 3 :(得分:1)

我相信你理解运算符++和*在单独使用时的含义。当一起使用时,运算符优先级发挥作用。在C ++中,++运算符的优先级高于*运算符。因此有效*y++表示*(y++)++y*表示(++y)*。我希望这会有所帮助。