5

当我阅读 K&R 的 TCPL 时,我只是无法理解两种表达方式:

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

这是我的想法:

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

    *p++ = val 可能和 一样*(p++) = val,因为指针通常是到顶部的下一个位置,所以在这段代码中,因为括号,p 先增加 1,所以 p 是当前顶部的两个单位,而不是当前顶部的一个单位当前顶部,val应该在哪里!!!谢谢

4

3 回答 3

7

前缀递增/递减和取消引用运算符的优先级相等,但后缀运算符的优先级更高,因此*p++与 相同*(p++),就像写*p = val; p++;

如果您编写了(*p)++ = val,它将无法编译,因为您会尝试为数字分配值。

于 2013-03-11T18:12:36.737 回答
4

K&R 中运算符的优先级和关联性,表 2-1,第 53 页,不像 Stroustrup,tC++PL,Sed,第 6.2 节运算符摘要,第 120-121 页中最近的表那样细化和完整。

C++ 运算符优先级 Agnew 的回答非常好。

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

  1. 第一个 p++ 求值,但返回前一个 p 值
  2. 然后 *p 用这个先前的 p 值进行评估,并且分配发生
  3. 然后语句结束并且 p++ 后增量值现在处于活动状态,即指针 p 现在被碰撞。
于 2013-06-01T23:41:53.523 回答
1

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

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

因此,简而言之,您只需混合编译器的解释顺序(由括号或优先级决定)和执行顺序(由后置或前置定义决定)。

于 2013-03-11T18:31:56.433 回答