我对这段代码将如何执行感到困惑。假设我们有
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;
}
发布于 2013-08-01 02:41:57
表达式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;
*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
发布于 2013-08-01 02:55:28
*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之后是误导性的,我想在这里澄清一下,我在这里使用了latter和after这两个词,以分别强调在表达式中将使用*y
的前一个或下一个值。
注意,副作用可以以任何顺序产生,或者先产生副作用,然后赋值,或者先赋值,再赋值。有关更多详细信息,请阅读答案:-- 1,Eric Lippert给出的2。
发布于 2013-08-02 00:40:43
*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;
或as
t = *y + 1;
q = t;
*y = t;
请记住,C不会对副作用发生的顺序产生太多限制,因此要小心。
https://stackoverflow.com/questions/17978286
复制相似问题