我对如何执行此代码感到困惑。假设我们有
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;
}
答案 0 :(得分:9)
表达式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
的{{1}}增量的第一个值已分配给31
(注意:temp
现在是{ {1}})。
问题的下一部分(阅读评论):
x
答案 1 :(得分:6)
*y++
和++*y
之间有什么区别?
C中表达式的含义有两个特征:它产生的 value 以及它产生的副作用。
让我们检查第一个表达式。
后缀增量优先于解除引用,因此这是*(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对副作用可能发生的顺序没有太多限制,所以要小心。
答案 2 :(得分:5)
* 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
分别用于表达式
注意,副作用可以以任何顺序产生,或者副作用首先产生,后者赋值,或者先分配值,后者产生副作用。有关详细信息,请阅读答案: - 1,2,Eric Lippert。
答案 3 :(得分:1)
我相信你理解运算符++和*在单独使用时的含义。当一起使用时,运算符优先级发挥作用。在C ++中,++运算符的优先级高于*运算符。因此有效*y++
表示*(y++)
,++y*
表示(++y)*
。我希望这会有所帮助。