当我阅读 K&R 的 TCPL 时,我只是无法理解两种表达方式:
*p++ = val; /*push val onto stack */
这是我的想法:
取消引用和后缀具有相同的优先级,并且关联性是从右到左,所以
*p++ = val
可能和 一样*(p++) = val
,因为指针通常是到顶部的下一个位置,所以在这段代码中,因为括号,p 先增加 1,所以 p 是当前顶部的两个单位,而不是当前顶部的一个单位当前顶部,val应该在哪里!!!谢谢
当我阅读 K&R 的 TCPL 时,我只是无法理解两种表达方式:
*p++ = val; /*push val onto stack */
这是我的想法:
取消引用和后缀具有相同的优先级,并且关联性是从右到左,所以
*p++ = val
可能和 一样*(p++) = val
,因为指针通常是到顶部的下一个位置,所以在这段代码中,因为括号,p 先增加 1,所以 p 是当前顶部的两个单位,而不是当前顶部的一个单位当前顶部,val应该在哪里!!!谢谢
前缀递增/递减和取消引用运算符的优先级相等,但后缀运算符的优先级更高,因此*p++
与 相同*(p++)
,就像写*p = val; p++;
如果您编写了(*p)++ = val
,它将无法编译,因为您会尝试为数字分配值。
K&R 中运算符的优先级和关联性,表 2-1,第 53 页,不像 Stroustrup,tC++PL,Sed,第 6.2 节运算符摘要,第 120-121 页中最近的表那样细化和完整。
C++ 运算符优先级 Agnew 的回答非常好。
他指出,对于一元运算符和 *(p++),关联确实是 R->L,
运算符的优先级是编译器对其解释的顺序,而不是它们的执行顺序。
运算符优先级实际上意味着“在哪里放置括号”。因此,您是正确*p++
的,与 相同*(p++)
。但是现在我们需要了解什么是*(p++)
. 由于后固定操作,这意味着取*p
然后增加。p++
因此,简而言之,您只需混合编译器的解释顺序(由括号或优先级决定)和执行顺序(由后置或前置定义决定)。