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

Rav*_*sla 5 c pointers pointer-arithmetic

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

int x=30,*y,*z;
y=&x;
Run Code Online (Sandbox Code Playgroud)

*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;
}
Run Code Online (Sandbox Code Playgroud)

Gri*_*han 9

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

x = *y;
y = y + 1;
Run Code Online (Sandbox Code Playgroud)

如果表达式只是*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;
Run Code Online (Sandbox Code Playgroud)

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

下一种情况:假设您的代码是:

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

temp = ++*y;  //this is same as *y = *y + 1; temp = *y;
Run Code Online (Sandbox Code Playgroud)

*y30to到31then的第一个增量值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
Run Code Online (Sandbox Code Playgroud)


Eri*_*ert 6

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

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

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

Postfix增量优先于解除引用,所以这是*(y++).

后缀增量会产生副作用:它会将值更改y为指向其他位置.后缀增量也会产生一个值:y增加之前的值.该*运营商则取消引用该值来产生一个左值:那就是,有些东西你可以为一个变量使用,无论是存储或获取.

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

q = *y++ 
Run Code Online (Sandbox Code Playgroud)

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

q = *y;
y = y + 1;
Run Code Online (Sandbox Code Playgroud)

或者它可以被视为

t = y;
y = y + 1;
q = *t;
Run Code Online (Sandbox Code Playgroud)

两者都是完全合法的.(当然,除非y本身是一种具有副作用的表达,否则这些副作用必须只产生一次.为清楚起见,我将在整个过程中做出这样的假设.)

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

q = ++*y
Run Code Online (Sandbox Code Playgroud)

可以视为:

t = *y + 1;
*y = t;
q = t;
Run Code Online (Sandbox Code Playgroud)

或者作为

t = *y + 1;
q = t;
*y = t;
Run Code Online (Sandbox Code Playgroud)

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


hac*_*cks 5

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

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

*(y++) = *(z++);
Run Code Online (Sandbox Code Playgroud)

如果是++*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
Run Code Online (Sandbox Code Playgroud)

编辑:正如Eric Lippert在评论中指出的那样:表达式的值*y在增量之前,增量y之后是误导性的,我想在这里澄清我使用后者之后的词语分别强调前一个下一个*y,将用于表达式.
注意,副作用可以以任何顺序产生,或者副作用首先产生,后者赋值,或者先分配值,后者产生副作用.进一步的细节参考答案: - 1,2给出埃里克利珀.