我只是读了一些代码,发现这个人arr[-2]用来访问之前的第二个元素arr,如下所示:
|a|b|c|d|e|f|g|
^------------ arr[0]
^---------- arr[1]
^---------------- arr[-2]
Run Code Online (Sandbox Code Playgroud)
这是允许的吗?
我知道那arr[x]是一样的*(arr + x).所以arr[-2]就是*(arr - 2),这似乎确定.你怎么看?
我知道编码风格会很糟糕,但是下面的代码在我的机器上运行得很好.但这种行为是否定义明确?便携式?
int main()
{
int *p = new int[3];
int *q = &p[2];
q[-1] = 41;
std::cout << p[1];
delete[] p;
}
Run Code Online (Sandbox Code Playgroud) 考虑以下代码:
int A[5] = {0,1,2,3,4};
int i=1;
int test = A[i];
Run Code Online (Sandbox Code Playgroud)
此代码生成的 MIPS 程序集将向左移动i 2 位以乘以 4,因为我们获取的是 int(4 字节)。我完全理解这一点。
现在如果我们设置
int i = -1; //or any negative number
Run Code Online (Sandbox Code Playgroud)
生产的组件实际上是相同的。但是在这里,我们将一个负数移动了 2 位,这实际上可以返回一个正数。所以,我的问题是, A[negative_number] 不会用这个负数来抵消地址,但它会产生一个有点随机的结果,对吧?