如果ptr是静态数组的第一个元素的ptr,编译器将如何评估++ * ptr ++?

时间:2019-03-31 10:54:05

标签: c++ pointers operators

++*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。

4 个答案:

答案 0 :(得分:6)

后缀增量a++使指针ptr递增,但是在操作之前返回ptr的副本(请参见前缀/后缀之间的区别)。 这样就可以将其重写为++(*(ptr ++))(如Quimby的答案所述),就像这样:

  1. ptr ++:增加ptr使其指向99,但返回另一个仍指向9的指针
  2. * ptr ++:取消引用,计算结果为9
  3. ++ * ptr ++:递增复制指针所指向的值,即递增9并返回10

在此之前/之后递增/递减的逻辑解释得很好:

  

预增和预减运算符可递增或递减对象的值,并返回对结果的引用。   递增和递减后创建对象的副本,递增或递减对象的值,并从递增或递减之前返回副本。

发件人:https://en.cppreference.com/w/cpp/language/operator_incdec

答案 1 :(得分:1)

简而言之,因为++*ptr++被重写为++(*(ptr++))

链接中的规则很明确:

  1. 后缀++的优先级最高=> ++*(ptr++)
  2. 前缀++和*具有相同的优先级,并且它们是右关联的=> ++(*(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++)