为什么不是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