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

时间:2013-03-11 18:01:20

标签: c operators operator-precedence

当我通过K& R阅读TCPL时,我无法理解两个表达式:

*p++ = val;  /*push val onto stack */

这是我的想法:

  • 取消引用和后缀具有相同的优先级,关联性是从右到左,所以

    *p++ = val可能与*(p++) = val相同,因为指针通常是顶部的下一个位置,因此在此代码中,p因括号而首先增加1,所以p是两个高于当前顶部的单位,但不是当前顶部之上的一个单位,其中val应该是!!! THX

3 个答案:

答案 0 :(得分:6)

前缀增量/减量和解除引用运算符的优先级相同,但后缀运算符更高,因此*p++*(p++)相同,这就像写*p = val; p++;

如果你写了(*p)++ = val,它就不会编译,因为你试图为一个数字赋值。

答案 1 :(得分:3)

K& R中操作员的优先级和相关性,表2-1,第53页, 不像Stroustrup中的最新表那样精细和完整,tC ++ PL,Sed,sec 6.2运算符摘要,p120-121。

C++ operator precedence 阿格纽的答案非常好。

他指出,对于一元运算符而言,关联确实是R-> L,对于*(p ++),

  1. 首先是p ++评估,但之前的p值是返回
  2. 然后使用之前的p值评估* p并进行分配
  3. 然后语句结束,p ++ post increment值现在处于活动状态,即指针p现在被碰撞。

答案 2 :(得分:1)

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

运算符优先级实际上意味着“在哪里放括号”。因此,*p++*(p++)相同是正确的。 但现在我们需要了解*(p++)是什么。这意味着,由于后期修复操作,需要*p然后增加p++

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