C ++试图理解用于破译复杂语法的顺时针规则
c++ trying to understand clockwise rules for deciphering complicated syntax
我有以下代码:
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]
相同。
对于数组。第一维的有效索引为:0
、1
和2
。使用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]
由于操作的优先级,它们不等效。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 函数复杂度分析
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 单独定义模板化嵌套类方法的正确语法
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 函数的时间复杂度是多少?
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 使用 Python Extension API 包装复杂C++类
- C ++试图理解用于破译复杂语法的顺时针规则
- 高级指针复杂的语法
- Visual C++ 2013 和错误 C2065:"复杂":未声明的标识符和错误 C2059:语法错误:","
- 复杂的语法(类)