当我通过K& R阅读TCPL时,我无法理解两个表达式:
*p++ = val; /*push val onto stack */
这是我的想法:
取消引用和后缀具有相同的优先级,关联性是从右到左,所以
*p++ = val
可能与*(p++) = val
相同,因为指针通常是顶部的下一个位置,因此在此代码中,p因括号而首先增加1,所以p是两个高于当前顶部的单位,但不是当前顶部之上的一个单位,其中val应该是!!! THX
答案 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 ++),
答案 2 :(得分:1)
运算符的优先级是编译器解释的顺序,而不是执行顺序。
运算符优先级实际上意味着“在哪里放括号”。因此,*p++
与*(p++)
相同是正确的。
但现在我们需要了解*(p++)
是什么。这意味着,由于后期修复操作,需要*p
然后增加p++
。
因此,简而言之,您只是按编译器(由括号或优先级确定)和执行顺序(由后置或预定义定义确定)混合了解释顺序。