C++ 运算符优先级 =、* 和 ++
C++ Operator priority =, * and ++
我对这个指针值赋值有疑问:
*p++ = *q++;
运算符的优先级为“++”>“*”>“=”。
但是上面语句的结果是先赋值“=”,如下
*p = *q;
p++;
q++;
为什么?
因为它们是post-修复运算符,而不是前缀!
post-increment 运算符在其值已被计算后递增其操作数。因此,指针解引用发生在指针在该行之前保存的值上。但是,您给出的优先级是正确的;该表达式确实等同于
(*(p++)) = (*(q++))
您错过了一个重要的区别。运算符有一个值,并且
它可能有副作用。在后缀 ++
的情况下,值为
value before 递增,副作用是
增量。表达式中使用的是值。旁边
效果可能会在完整表达式结束之前的任何时间发生(在
C++11之前的术语,但实际效果没有改变);编译器可能
首先递增两个指针,将它们之前的值保存在
注册并在表达式的其余部分使用它们,或者通过使用
直接从内存中获取值,并延迟两者的递增
指针直到表达式结束。或任何组合
导致相同可观察行为的操作。
我对这个指针值赋值有疑问:
*p++ = *q++;
运算符的优先级为“++”>“*”>“=”。
但是上面语句的结果是先赋值“=”,如下
*p = *q;
p++;
q++;
为什么?
因为它们是post-修复运算符,而不是前缀!
post-increment 运算符在其值已被计算后递增其操作数。因此,指针解引用发生在指针在该行之前保存的值上。但是,您给出的优先级是正确的;该表达式确实等同于
(*(p++)) = (*(q++))
您错过了一个重要的区别。运算符有一个值,并且
它可能有副作用。在后缀 ++
的情况下,值为
value before 递增,副作用是
增量。表达式中使用的是值。旁边
效果可能会在完整表达式结束之前的任何时间发生(在
C++11之前的术语,但实际效果没有改变);编译器可能
首先递增两个指针,将它们之前的值保存在
注册并在表达式的其余部分使用它们,或者通过使用
直接从内存中获取值,并延迟两者的递增
指针直到表达式结束。或任何组合
导致相同可观察行为的操作。