C++ 运算符优先级 =、* 和 ++

C++ Operator priority =, * and ++

我对这个指针值赋值有疑问:

*p++ = *q++;

根据 Operator Priority Table

运算符的优先级为“++”>“*”>“=”。

但是上面语句的结果是先赋值“=”,如下

*p = *q;
p++;
q++; 

为什么?

因为它们是post-修复运算符,而不是前缀!

post-increment 运算符在其值已被计算后递增其操作数因此,指针解引用发生在指针在该行之前保存的值上。但是,您给出的优先级是正确的;该表达式确实等同于

(*(p++)) = (*(q++))

您错过了一个重要的区别。运算符有一个值,并且 它可能有副作用。在后缀 ++ 的情况下,值为 value before 递增,副作用是 增量。表达式中使用的是值。旁边 效果可能会在完整表达式结束之前的任何时间发生(在 C++11之前的术语,但实际效果没有改变);编译器可能 首先递增两个指针,将它们之前的值保存在 注册并在表达式的其余部分使用它们,或者通过使用 直接从内存中获取值,并延迟两者的递增 指针直到表达式结束。或任何组合 导致相同可观察行为的操作。