C - *y++ 和 ++*y 之间的差异



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

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;
}

表达式 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,然后将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语言中表达式的含义有两个特点:它产生什么价值和它产生什么副作用

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

后缀增量的优先级高于取消引用,因此*(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)*. 我希望这有所帮助。

相关内容

  • 没有找到相关文章

最新更新