我对如何执行此代码感到困惑。假设我们有
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;
}
我对如何执行此代码感到困惑。假设我们有
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;
从to和 then*y
增量的第一个值被分配给(注意: 是 now )。 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 有什么区别?
在表达式*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。
*y++
和有什么区别++*y
?
C 中表达式的含义有两个特点:它产生什么值以及它产生什么副作用。
让我们检查第一个表达式。
后缀增量比取消引用具有更高的优先级,所以这是*(y++)
.
后缀增量会产生副作用:它会将 的值更改y
为指向不同的位置。后缀增量也产生一个值:y
在它增加之前的值。然后*
,运算符取消引用该值以生成左值:也就是说,您可以将其用作变量,用于存储或从中获取。
我注意到副作用可能发生在取消引用之前或之后的任何时候。如果你说
q = *y++
那么它的副作用++
可能在任何时候发生。这可能是:
q = *y;
y = y + 1;
或者它可以被视为
t = y;
y = y + 1;
q = *t;
两者都是完全合法的。(当然,除了 ify
本身是一个带有副作用的表达式,那些副作用必须只产生一次。为了清楚起见,我将自始至终做出这个假设。)
怎么样++*y
?这很简单:*y
产生一个变量,变量的内容递增,表达式的值就是递增的值。再次注意,副作用可能是乱序产生的:
q = ++*y
可以被视为:
t = *y + 1;
*y = t;
q = t;
或作为
t = *y + 1;
q = t;
*y = t;
请记住,C 不会对副作用发生的顺序产生很多限制,所以要小心。
我相信您理解运算符 ++ 和 * 分别使用时的含义。当一起使用时,运算符优先级开始发挥作用。在 C++ 中,++ 运算符的优先级高于 * 运算符。所以有效的*y++
手段*(y++)
和++y*
手段(++y)*
。我希望这有帮助。