取消引用和后缀的优先顺序

当我通过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 ++)的关联

  1. 第一个p ++计算,但返回前一个p值
  2. 然后使用之前的p值评估* p并进行赋值
  3. 然后语句结束并且p ++ post增量值现在处于活动状态,即指针p现在被碰撞。

运算符的优先级是编译器解释的顺序,而不是执行顺序。

运算符优先级实际上意味着“放置括号的位置”。 因此,你是正确的*p++*(p++) 。 但现在我们需要了解什么是*(p++) 。 这意味着由于后固定操作,取*p然后增加p++

因此,简而言之,您只是将编译器的解释顺序(由括号或优先级确定)和执行顺序(由后置或预定义定义确定)混合在一起。