C++ C++;递增指针

C++ C++;递增指针,c++,pointers,post-increment,pre-increment,C++,Pointers,Post Increment,Pre Increment,为什么我可以做像*x=*x+1;,但是做一些像*x=*x++;似乎没有任何影响 代码: //示例程序 #包括 #包括 使用名称空间std; 无效剂量测量(int*x,int*y) { *x=*x++; *y=*y+5; } int main() { int x=4; int y=3; 剂量测定法(&x和&y); 这句话怎么说 *x = *x+1; *x = *x++; 可以这样写 *x = ++*x; 你当然可以写 ++*x; 至于这句话, *x = *x+1; *x = *x++;

为什么我可以做像*x=*x+1;,但是做一些像*x=*x++;似乎没有任何影响

代码:

//示例程序
#包括
#包括
使用名称空间std;
无效剂量测量(int*x,int*y)
{
*x=*x++;
*y=*y+5;
}
int main()
{
int x=4;
int y=3;
剂量测定法(&x和&y);
这句话怎么说

*x = *x+1;
*x = *x++;
可以这样写

*x = ++*x;
你当然可以写

++*x;
至于这句话,

*x = *x+1;
*x = *x++;
那么它就相当于

*x = *( x++ );
并且具有未定义的行为,因为后增量运算符的副作用未排序。

此语句

*x = *x+1;
*x = *x++;
可以这样写

*x = ++*x;
你当然可以写

++*x;
至于这句话,

*x = *x+1;
*x = *x++;
那么它就相当于

*x = *( x++ );

由于后增量运算符的副作用未排序,因此具有未定义的行为。

后缀运算符
++
的优先级高于
解引用操作符*
的优先级。语句
*x=*x++;
的执行如下
*x=(*(x++)


如您所见,首先执行
++
运算符,使指针指向它所指向的位置。从那里开始,执行
取消引用
运算符。如果要增加
x
的实际值,只需写入
++*x;

后缀运算符
++
的优先级高于
 取消引用*
运算符。语句
*x=*x++;
按如下方式执行
*x=(*(x++)


如您所见,首先执行
++
运算符,使指针指向它所指向的位置。然后执行
取消引用
运算符。如果要增加
x
的实际值,只需写入
++*x;

,因为所有表达式都会跟随

如表中所示,运算符
operator++
的优先级高于
operator*

您可以使用括号更好地跟随代码:

*x = *x++;
相当于:

*x = *(x++);
简言之,在取消引用指针后,将增加指针的值

在记忆中,它会发生如下情况:

|  x = 4   |     <---- &x
|  trash   |
|  trash   |

因为所有的表达都遵循

如表中所示,运算符
operator++
的优先级高于
operator*

您可以使用括号更好地跟随代码:

*x = *x++;
相当于:

*x = *(x++);
简言之,在取消引用指针后,将增加指针的值

在记忆中,它会发生如下情况:

|  x = 4   |     <---- &x
|  trash   |
|  trash   |


你不是在“增加指针”,你是在“增加指针指向的对象”。试试
++*x
?我不知道为什么会被否决。我在视频@31:25的旁边看到了上面的代码:完全脱离主题的语法更正:效果,而不是影响。你不是在“增加指针”,您正在“递增指针指向的对象”。试一试
++*x
?我不知道为什么这会被否决。我跟在这段视频后面@31:25是对上面代码的引用:完全脱离主题的语法更正:效果,不影响。
x++
的表达式结果是
x
的原始值。
x++
的表达式结果是“代码> x/<代码> <代码> *x++*x也是ub.@ OivirCARESWORKS:它是C++ 03中的UB,但我不确定C++ 11。在阿尔夫之前,有一个关于排序的事情。= C++ 11这样的表达式语句是有效的。好,我不知道C++中的行为改变了。无论如何,仍然有一个世界上有很大一部分是UB(无论哪种方式,都可能在读者中造成混乱/不信任)为什么不建议写代码“>代码+> x?@ OLVILARCHARESVISH我用它来描述如何使用作者所希望的增量操作符来正确编写.<代码> *++*x/<代码>也是UB.@ OLIVARCHARESVES:这是C++ 03中的UB,但是我不确定C++ 11。在C++之前有一些排序的事情。@ CalthHthth.-阿尔夫在C++中的应用11这样的表达式语句被认为是有效的。好吧,我不知道C++11中的行为发生了变化。无论如何,世界上仍然有很大一部分是UB(而且无论哪种方式,都可能在读者中造成混乱/不信任)。为什么不建议只写
++*x;
?@OliverCharlesworth我演示了如何按照作者的要求使用增量运算符正确地编写它。
*x=(*x)+;
现在你又遇到了另一个问题。
(*x)+;
?@BoPersson抱歉,太快了,我修复了“您正在递增指针的值,并且在取消引用它之后"。这是真的吗?增量是一个可能在分配之前或之后发生的副作用。我的理解是,
*x++
将始终取消引用
x
的原始位置,然后稍后
x
将移动到下一个位置。因此结果未定义?可能垃圾箱位置获得分配的值4?
*x=(*x)+;
现在您又遇到了另一个问题。
(*x)+;
怎么样?@BoPersson抱歉,太快了,我修复了“您正在增加指针的值,并且在取消引用它之后”。这是真的吗?增量是一个可能在分配之前或之后发生的副作用。我的理解是,
*x++
将始终取消引用
x
的原始位置,然后稍后
x
将移动到下一个位置。因此结果未定义?可能垃圾箱位置获得分配的值4?