++*ptr++
中的评估顺序是什么?在操作中涉及指针和左值时,它会改变吗?
如果a++
的优先级高于*a
或++a
,那么为什么++*a++
被评估为首先返回递增的值,然后更改指针,而不是更改指针指针,然后在该位置递增该值。
优先权:https://en.cppreference.com/w/cpp/language/operator_precedence
arr = {9, 99, 999 };
int *ptr = arr;
std::cout << ++*ptr++ << '\t';
std::cout << *ptr;
我希望输出为100 100,但实际输出为10 99。
答案 0 :(得分:6)
后缀增量a++
使指针ptr递增,但是在操作之前返回ptr的副本(请参见前缀/后缀之间的区别)。
这样就可以将其重写为++(*(ptr ++))(如Quimby的答案所述),就像这样:
在此之前/之后递增/递减的逻辑解释得很好:
预增和预减运算符可递增或递减对象的值,并返回对结果的引用。 递增和递减后创建对象的副本,递增或递减对象的值,并从递增或递减之前返回副本。
发件人:https://en.cppreference.com/w/cpp/language/operator_incdec
答案 1 :(得分:1)
简而言之,因为++*ptr++
被重写为++(*(ptr++))
链接中的规则很明确:
++*(ptr++)
++(*(ptr++))
表达式也可以分为如下单个语句:
arr = {9, 99, 999 };
int *ptr = arr;
int *ptr2 = ptr++;//ptr2 still points to the first element
int val = *ptr2; // 9
int incVal= ++val; // 10
希望很清楚,ptr
现在指向数组的第二个元素,表达式的结果是递增的值。
答案 2 :(得分:1)
后缀运算符的前缀具有更高的优先级,因此它们紧紧/优先地绑定,因此:++*ptr++
与++(*(ptr++))
相同,归结为操作数对什么起作用。因此,后缀++将应用于“ ptr”指针,但应用于“ std :: cout”第一行之后。前缀++可以在取消引用的ptr上使用,因此所有操作都与以下命令相同:
int arr[] = {9, 99, 999 };
int *ptr = arr;
++(*ptr); // 9+1=10
std::cout << *ptr << '\t';
ptr++; // now ptr points to 99
std::cout << *ptr;
答案 3 :(得分:0)
因为您使用的是一维数组
++*ptr
指的是指针ptr指向数组0个元素的增量,在递增后的输出为10
后缀++
的优先级最高=> ++*(ptr++)