今天看到一段代码有震惊,不用多说,是我太菜
#include<bits/stdc++.h>
using namespace std;
/***********************/
#define inf 0x3f3f3f3f
const int MAX =2e6+ 10;
/*********************/
int aa[MAX],dd[MAX],n,m;
int main(){
/*....略....*/
int *a=aa+1000000,*d=dd+1000000;
/*....略....*/
for(int i=-40000;i<=m+40000;i++){
d[i]+=d[i-1];
a[i]+=a[i-1]+d[i-1];
}
/*.....略...*/
return 0;
}
这里数组下标竟然可以为负//菜鸡的震惊
仔细观察后发现a、d都是指针。于是自己动手写了一段简洁一点的
#include <bits/stdc++.h>
using namespace std;
int aa[30];
int main()
{
int *a=aa+5;
for(int i=-5;i<=5;i++)
a[i]=i;
for(int i=-5;i<=5;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
运行结果果然是
-5 -4 -3 -2 -1 0 1 2 3 4 5
那么C/C++到底支不支持负数作为下标呢?
https://stackoverflow.com/questions/3473675/are-negative-array-indexes-allowed-in-c
这里有人讨论过,总结一下就是数组的下标运算和指针的移动是一样的。
比如上面的例子,我们打印一下每个数的地址看一下:
a指针的地址在aa地址的5个int位后,因此我们对a使用-5的数组下标得到的也是合法地址。
虽然不知道它有什么用?,分享一下