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

Adi*_*pra 2 c++ pointers operators

评估的顺序是++*ptr++什么?当指针和左值涉及到操作时,它会改变吗?

如果的优先级a++高于*a++a,则将Why ++*a++评估为:首先返回递增的值,然后更改指针,而不是更改指针,然后在该位置递增值。优先权:https//en.cppreference.com/w/cpp/language/operator_precedence

arr = {9, 99, 999 };
int *ptr = arr;
std::cout << ++*ptr++ << '\t';
std::cout << *ptr;

Run Code Online (Sandbox Code Playgroud)

我期望输出为100 100,但实际输出为10 99。

Loc*_*bal 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