我对如何执行此代码感到困惑。 假设我们有
int x=30,*y,*z; y=&x;
* y ++和++ * y之间有什么区别? 以及该计划的产出是什么?
#include 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 = *y + 1;
(指针不递增)回答第一个问题会更清楚:
假设您的代码是:
int x = 30, *y; int temp; y = &x; temp = *y++; //this is same as: temp = *y; y = y + 1;
First *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
*y++
和++*y
之间有什么区别?
C语言中表达式的含义有两个特征:它产生什么价值以及产生什么副作用 。
我们来看看第一个表达式。
Postfix增量的优先级高于解除引用,因此这是*(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)*
。 我希望这有帮助。
以上就是c/c++开发分享* y ++和++ * y之间的区别?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560336.html