C++中arr[5]与5[arr]这两个cout语句对数组的处理是否一致?
arr[5] 和 5[arr] 在C++中是否等价?
放心,这两行代码完全等价,在C++(以及C语言)的语法规则里,数组下标运算符[]其实是一层语法糖,背后的逻辑非常清晰:
对于表达式a[b],编译器会把它解析成*(a + b)——这里的数组名arr会被隐式转换成指向数组第一个元素的指针,而加法运算遵循交换律,所以*(a + b)和*(b + a)是完全相同的内存访问操作,自然a[b]就等价于b[a]。
拿你给出的代码举例:
int arr[] = {1,2,3,4,5,6}; cout << arr[5] << endl; cout << 5[arr] << endl;
arr[5]是取数组下标为5的元素(也就是第6个元素,值为6);5[arr]本质是*(5 + arr),和*(arr + 5)指向的是同一块内存地址,所以输出结果必然一致。
至于你遇到的数组越界情况,不管是arr[n]还是n[arr],只要n超出了数组的有效下标范围,都会访问到数组内存之外的未知区域,这种行为在C++里属于未定义行为,所以两者都输出“垃圾值”也完全符合预期——本质上它们做的是一模一样的非法内存访问操作。
内容的提问来源于stack exchange,提问作者Steel
相关产品推荐
相关产品推荐

