我明白了:
int main(){
int Array[] = { 10, 20, 30 };
cout << -2[Array] << endl;
system("Pause");
return 0;
}
输出结果为:
-30
我想知道为什么输出是-30以及为什么会导致这种未定义的行为?
有谁知道?
答案 0 :(得分:3)
-2[Array]
被解析为-(2[Array])
,因为下标的优先级高于一元减号。
现在,2[Array]
is just a weird way to write Array[2]
,所以你得到-Array[2]
,即-30。整个表达式中不涉及未定义的行为。
答案 1 :(得分:1)
这很简单。
首先,让我们分析一下表达式:
-2[Array]
是
-(2[Array])
现在a[b]
为*(a+b)
,由于加法是可交换的,因此*(b+a)
也是Array[2]
。
Array[2]
是30
; -Array[2]
是-30
。因此,-2[Array]
也是-30
。
我真诚地希望您不打算在生产代码中使用它。
答案 2 :(得分:0)
在C ++中,以下陈述为真:
a[5] == 5[a]
这是因为使用[]
的语法转换为:
*(a + 5)
E.g。
a[5] == *(a + 5)
这意味着
5[a] == *(5 + a)
因此,符号-2[Array]
将转换为- *(2 + Array)
。
答案 3 :(得分:0)
它将一元运算符( - ,减号)应用于由[]之外的值递增的指针:- *(2 + Array)
。您可以通过删除减号来检查它,从而应用+一元运算符。我不建议使用这种语法。