为什么表达式*(b ++)不首先评估b ++?

Sel*_*enç 0 c++ pointers operators operator-precedence

我试图理解括号如何影响表达式中的优先级:

int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
auto b = arr;
std::cout << *(++b) << std::endl;

// output : 1
Run Code Online (Sandbox Code Playgroud)

在这段代码中,我得到了预期的输出,但如果我将其更改为:

std::cout << *(b++) << std::endl;
// output 0 
Run Code Online (Sandbox Code Playgroud)

我得到0了输出.由于括号我b++将首先进行评估,然后进行解引用.看来我错了,那么我完全去除括号和测试与*++b*b++并获得意味着括号并不影响这种表达的优先级相同results.Does?为什么这两个表达式的结果是等价的:

*(b + 1) 
*(++b) 
Run Code Online (Sandbox Code Playgroud)

但事实并非如此*(b++)

小智 7

确实评估了b++第一个.b++递增b并返回以前的值b,增量发生.结果b++b之后的价值是不同的.把它想象成(使用int而不是int *因为引用指针使签名变得丑陋):

int postfix_increment(int &x) {
    int result = x;
    x = x + 1;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

(除了在下一个序列点之前使用递增的值是未定义的行为.)

如果为括号的结果引入临时变量,为了确保首先评估它,可能更容易看到差异:

int *tmp = b++;
// At this point, b == tmp + 1!
std::cout << *tmp << std::endl;
Run Code Online (Sandbox Code Playgroud)