为什么*(ptra + 0).prop
无效且(*(ptra + 0)).prop
有效? 。我知道点运算符的左侧必须有一个结构。但我仍然感到困惑。有人可以向我解释两者之间的区别吗?
class myobj
{
public:
int v;
};
int main()
{
myobj *ptra = new myobj[2]();
*(ptra + 0).v = 12 //Error
(*(ptra + 0)).v = 12 ; //OK
return 0;
}
答案 0 :(得分:3)
因为operator .
有一个higher precedence然后operator *
,所以
*(ptra + 0).v
装置
*((ptr + 0).v)
而不是
(*(ptra + 0)).v
*((ptr + 0).v)
这里的语法不正确,因为(ptr + 0)
不是类或联合,所以没有任何成员。
答案 1 :(得分:0)
像这样的错误是由运算符优先级引起的。在这种情况下,执行的第一个运算符是operator.
,而第二个执行的运算符是operator*
。这就是为什么一行编译而另一行不编译,即使它们看起来非常相似。
要覆盖此运算符优先级,请使用括号,如
(1 + 2) * 3 = 9
而不是
1 + 2 * 3 = 7.