为什么不是arr 相当于-2 ?

#include <iostream> using namespace std; int main() { int arr[3] = { 10, 20, 30 }; cout << arr[-2] << endl; cout << -2[arr] << endl; return 0; } 

输出:

 4196160 -30 

这里arr[-2]超出范围且无效,导致未定义的行为 。 但-2[arr]评估为-30 。 为什么?

不是arr[-2]等于-2[arr]

-2[arr]被parsing为-(2[arr]) 。 在C中(而在C ++中,忽略重载), X[Y]的定义是*(X+Y) ( 这个问题更多的讨论),这意味着2[arr]等于arr[2]

编译器parsing这个expression式

 -2 

喜欢

 unary_minus decimal_integer_literal 

这是整数文字的定义不包括标志。

反过来的expression

 2[arr] 

被编译器parsing为后缀expression式。

后缀expression式比一元expression式具有更高的优先级。 因此这个expression

 -2[arr] 

相当于

 - ( 2[arr] ) 

所以一元减号被应用于由后缀expression式2[arr]返回的左值。

另一方面,如果你写

 int n = -2; 

接着

 n[arr] 

那么这个expression式就相当于

 arr[-2] 

-2[arr]相当于-(2[arr]) ,相当于-arr[2] 。 但是, (-2)[arr]相当于arr[-2]

这是因为E1 [E2]与(*((E1)+(E2)))相同

根本问题是运算符优先级 。 在C ++中, [] ,即下标运算符比–unary_minus运算符具有更高的优先级(有点类似于优先)。

所以当一个人写道,

 arr[-2] 

编译器首先执行arr[]然后- ,但是unary_minus被包含在[-2]的范围内,所以expression式被一起分解。

在里面,

 -2[arr] 

同样的事情发生,但是,编译器首先执行2[]运算符,所以它最终是-(2[arr])不是(-2)[arr]

你对arr[i] i[arr]*(i+arr)都是一样的概念的理解是正确的。 他们都是等同的expression。

如果你想这样写,写成(-2)[arr] 。 你肯定会得到相同的价值。

请检查以便今后参考: http : //en.cppreference.com/w/cpp/language/operator_precedence