为什么这个奇怪的代码有效?

时间:2016-04-23 01:42:04

标签: c++

我明白了:

int main(){
    int Array[] = { 10, 20, 30 };
    cout << -2[Array] << endl;
    system("Pause");
    return 0;

}

输出结果为:

  

-30

我想知道为什么输出是-30以及为什么会导致这种未定义的行为?

有谁知道?

4 个答案:

答案 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)。您可以通过删除减号来检查它,从而应用+一元运算符。我不建议使用这种语法。