解引用和后缀的优先级



当我阅读K&R的TCPL时,我就是看不懂两个表达式:

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

这是我的想法:

  • 解引用和后缀具有相同的优先级,并且结合性是从右到左,所以

    *p++ = val可能与*(p++) = val相同,因为指针通常是顶部的下一个位置,所以在这段代码中,p首先增加1,因为括号,所以p是当前顶部上方的两个单位,但不是当前顶部上方的一个单位,val应该在哪里!!Thx

前面的自增/自减运算符和解引用运算符的优先级相等,但后面的运算符更高,所以*p++*(p++)是一样的,相当于写*p = val; p++;

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

K&R中操作符的优先级和结合性,表2-1,第53页,不像Stroustrup, tc++ PL,Sed, sec6.2 Operator summary, p120-121中最近的表那样精细和完整。

c++操作符优先级阿格纽的回答非常好。

他指出对于一元操作符的关联确实是R->L,对于*(p++),

  1. 第一个p++求值,但前一个p值返回
  2. 则*p用前一个p值求值,赋值发生
  3. 则语句结束,p++后的增量值现在是活动的,即指针p现在被选中。

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

运算符优先级实际上意味着"放在括号的位置"。因此,您是正确的,*p++*(p++)相同。但是现在我们需要了解什么是*(p++)。这意味着先取*p,然后再增加p++,因为有后固定运算。

所以,简而言之,你只是混合了编译器的解释顺序(由括号或优先级决定)和执行顺序(由后置或前置定义决定)。

最新更新