C ++试图理解用于破译复杂语法的顺时针规则

c++ trying to understand clockwise rules for deciphering complicated syntax

本文关键字:复杂 语法 规则 顺时针 用于      更新时间:2023-10-16

我有以下代码:

int ia[3][4] = {    //
{0, 1, 2, 3},   //
{4, 5, 6, 7},   //
{8, 9, 10, 11}  //
};
int (*p4)[4] = ia;
cout << "(*(p4 + 0))[3] = " << (*(p4 + 0))[3] << endl;
cout << "*(p4 + 0)[3] = " << *(p4 + 0)[3] << endl;

获取以下输出:

(*(p4 + 0))[3] = 3
*(p4 + 0)[3] = 1

我不明白最后一个它是如何到达 1 的。 任何帮助都会很棒。 谢谢。

我不明白最后一个它是如何到达 1 的。

未定义的行为将您带到了那里。

由于运算符优先级(数组索引运算符比指针取消引用运算符绑定得更紧密(,

*(p4 + 0)[3]
*((p4 + 0)[3])相同,与:
*(p4[3])相同,与:
p4[3][0]相同。

对于数组。第一维的有效索引为:012。使用3的索引值访问数组会访问超出有效范围的内存,从而导致未定义的行为。

后缀表达式的优先级高于一元表达式。

所以这个表达

*(p4 + 0)[3]

等效于表达式

*( (p4 + 0)[3] )

可以看出,它与

( *(p4 + 0) )[3]

这个表达式*( (p4 + 0)[3] )可以像*p4[3]一样写成等效于*ia[3],并且由于优先级被认为是像

*( ia[3] )

或喜欢

ia[3][0]

数组ia的第一维索引的有效范围是[0, 2],因为数组的声明如下

int ia[3][4] = { /*...*/ };
^^^

因此,表达式ia[3]尝试访问数组之外的内存。因此,代码段具有未定义的行为。

简而言之,您应该了解这些表达方式

(*(p4 + 0))[3]
*(p4 + 0)[3]

反过来等效于以下一对表达式

ia[0][3]
io[3][0]

由于操作的优先级,它们不等效。