取消引用和后缀的优先顺序
当我通过K&R阅读TCPL时,我无法理解两个表达式:
*p++ = val; /*push val onto stack */
这是我的想法:
-
dereference和postfix具有相同的优先级,并且关联性是从右到左,所以
*p++ = val
可能与*(p++) = val
,因为指针通常是顶部的下一个位置,所以在这段代码中,p因为括号而首先增加1,所以p是上面的两个单位当前顶部,但不是当前顶部之上的一个单位,其中val应该是!!! 谢谢
前缀增量/减量和解除引用运算符是相同的优先级,但后缀运算符更高,因此*p++
与*(p++)
,这就像写*p = val; p++;
*p = val; p++;
如果你写了(*p)++ = val
,它就不会编译,因为你试图为一个数字赋值。
K&R中运算符的优先级和相关性,表2-1,第53页,不像Stroustrup中最近的表那样精细和完整,tC ++ PL,Sed,sec 6.2运算符汇总,p120-121。
C ++运算符优先级 Agnew的答案非常好。
他指出一元运算符的关联确实是R-> L而* *(p ++)的关联
- 第一个p ++计算,但返回前一个p值
- 然后使用之前的p值评估* p并进行赋值
- 然后语句结束并且p ++ post增量值现在处于活动状态,即指针p现在被碰撞。
运算符的优先级是编译器解释的顺序,而不是执行顺序。
运算符优先级实际上意味着“放置括号的位置”。 因此,你是正确的*p++
与*(p++)
。 但现在我们需要了解什么是*(p++)
。 这意味着由于后固定操作,取*p
然后增加p++
。
因此,简而言之,您只是将编译器的解释顺序(由括号或优先级确定)和执行顺序(由后置或预定义定义确定)混合在一起。