C++ 指针数组的增量和减量
我的老师给我提供了这个代码,它返回31,40,但我不知道为什么。它返回其所做内容的原因是什么C++ 指针数组的增量和减量,c++,arrays,pointers,C++,Arrays,Pointers,我的老师给我提供了这个代码,它返回31,40,但我不知道为什么。它返回其所做内容的原因是什么 void main() { int *ptr; int arr[5] = { 10, 20, 30, 40, 50 }; ptr = &arr[3]; cout << ++*ptr-- << ", " << *ptr; } void main(){ int*ptr; int-arr[5]={10,20,30,40,50}; p
void main() {
int *ptr;
int arr[5] = { 10, 20, 30, 40, 50 };
ptr = &arr[3];
cout << ++*ptr-- << ", " << *ptr;
}
void main(){
int*ptr;
int-arr[5]={10,20,30,40,50};
ptr=&arr[3];
库特
而f(ptr--)
和ptr
之间的求值顺序未指定(更具体地说是ptr--
和ptr
)
<> p>因此,对于给定代码,您得到了未定义的行为。 < P> C++标准声明
第1.9/15节[执行简介]:除非另有说明,否则对单个运算符的操作数和单个运算符的子表达式的求值
表达式未排序。(…)如果标量对象上的一个副作用相对于该对象上的另一个副作用未排序
相同的标量对象或使用相同
标量对象,行为未定义
++*ptr--
和*ptr
是使用同一对象的同一表达式的未排序子表达式:没有任何东西可以保证它们是从左到右求值的。因此,根据标准,这会导致未定义的行为。您的结果往往表明编译器选择先求值*ptr
,然后hen++*ptr--
编辑:++*ptr--
是++(*ptr--))
。这里运算符++
的操作数也使用对象ptr
,而--
对该对象有副作用。因此这也是未定义的行为。在您的例子中,编译器首先计算*ptr--
,结果是40和递减的ptr
,然后对t应用++
他取消了递减指针(即30增加了1)。因为在上一个<代码> *pTR <代码>和第一个<代码> PTR -<代码>之间没有序列点。<代码>无效主()/<代码>应该是代码> int()/<代码>;任何试图教C++的人都应该知道。"程序中的“指针数组”;有一个数组,还有一个指针。@KeithThompson:不,没有调用的命令,不要告诉我们空格是不相关的。你应该在问题中包含确切的输出。如果没有空格,那就表明某个地方存在严重问题。@MikeSeymour+*ptr--
很好。+
而-->
并没有修改相同的东西(指针上的-->,指针上的++
),问题是ptr-->
和*ptr
。这是operator@T.C.:已修复,谢谢(即使它不会改变答案)@KennyOstrom不,它没有定义。好吧,它确实被提升为ub,我的错。
cout << ++*ptr-- << ", " << *ptr;
operator <<(cout.operator <<(++*ptr--), ", ").operator <<(*ptr);
f(f(ptr--), ptr)