首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >*y++和++*y的区别是什么?

*y++和++*y的区别是什么?
EN

Stack Overflow用户
提问于 2013-08-01 02:39:02
回答 4查看 13.4K关注 0票数 5

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

代码语言:javascript
运行
复制
int x=30,*y,*z;
y=&x;

*y++和++*y有什么区别?还有,这个程序的输出是什么?

代码语言:javascript
运行
复制
#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;
}
EN

回答 4

Stack Overflow用户

发布于 2013-08-01 02:41:57

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

代码语言:javascript
运行
复制
x = *y;
y = y + 1;

如果表达式只是*y++; (没有赋值),那么它和y++;一样,也就是y开始指向递增后的下一个位置。

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

假设你的代码是:

代码语言:javascript
运行
复制
int x = 30, *y;
int temp;
y = &x;

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

第一个*y将被赋值给temp变量;因此temp30赋值,然后y的值加1,它开始指向x的位置之后的下一个位置(实际上不存在变量)。

下一个例子:假设你的代码是:

代码语言:javascript
运行
复制
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)。

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

代码语言:javascript
运行
复制
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
票数 9
EN

Stack Overflow用户

发布于 2013-08-01 02:55:28

*y++和++*y的区别是什么?

在表达式*y++*z++的情况下;因为后缀版本++优先于*,所以编译器将其视为;

代码语言:javascript
运行
复制
*(y++) = *(z++);

对于++*y;编译器将其视为++(*p),它将首先递增它所指向的对象的值(在本例中为x ),然后返回递增后的值。

其他可能性的汇总表;

代码语言:javascript
运行
复制
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之后是误导性的,我想在这里澄清一下,我在这里使用了latterafter这两个词,以分别强调在表达式中将使用*y的前一个或下一个值。

注意,副作用可以以任何顺序产生,或者先产生副作用,然后赋值,或者先赋值,再赋值。有关更多详细信息,请阅读答案:-- 1Eric Lippert给出的2

票数 6
EN

Stack Overflow用户

发布于 2013-08-02 00:40:43

*y++++*y的区别是什么?

表达式在C中的意义有两个特点:它产生了什么价值和产生了什么副作用。

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

后缀增量比取消引用具有更高的优先级,因此这是*(y++)

后缀增量产生了一个副作用:它将y的值更改为指向不同的位置。后缀递增还会生成一个值:y在递增之前具有的值。然后,*运算符解引用该值以生成一个左值:也就是说,您可以将其用作变量,用于存储或提取。

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

代码语言:javascript
运行
复制
q = *y++ 

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

代码语言:javascript
运行
复制
q = *y;
y = y + 1;

或者可以将其视为

代码语言:javascript
运行
复制
t = y;
y = y + 1;
q = *t;

两者都是完全合法的。(当然,如果y本身是一个有副作用的表达式,那么这些副作用必须只产生一次。为了清楚起见,我将从头到尾都做这样的假设。)

++*y呢?这很简单:*y生成一个变量,变量的内容递增,表达式的值就是递增后的值。请再次注意,副作用可能是无序产生的:

代码语言:javascript
运行
复制
q = ++*y

可以这样处理:

代码语言:javascript
运行
复制
t = *y + 1;
*y = t;
q = t;

或as

代码语言:javascript
运行
复制
t = *y + 1;
q = t;
*y = t;

请记住,C不会对副作用发生的顺序产生太多限制,因此要小心。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17978286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档