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

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

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

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

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

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

 x = *y; y = y + 1; 

如果表达式只是*y++; (没有任务)然后它只是与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; 

First *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; 

*y第一个值从30增加到31 ,然后将31分配给temp (注意: x现在是31 )。

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

 int x = 30, *y, *z; y = &x; // y ---> x , y points to x z = y; // z ---> x , z points to x *y++ = *z++; // *y = *z, y++, z++ , that is // x = x, y++, z++ x++; // increment x to 31 

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

C语言中表达式的含义有两个特征:它产生什么价值以及产生什么副作用

我们来看看第一个表达式。

Postfix增量的优先级高于解除引用,因此这是*(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对副作用可能发生的顺序没有太多限制 ,所以要小心。

* 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 ,将分别用于表达式。
注意,副作用可以以任何顺序产生,副作用首先产生,后者赋值,或者首先分配值,后者产生副作用。 欲了解更多细节,请阅读答案: – Eric Lippert给出的1,2 。

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