为什么arr [-2]不等于-2 [arr]?

msc*_*msc 32 c++ arrays undefined-behavior

#include <iostream>
using namespace std;

int main() 
{
    int arr[3] = { 10, 20, 30 };
    cout << arr[-2] << endl;
    cout << -2[arr] << endl;        
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

4196160
-30
Run Code Online (Sandbox Code Playgroud)

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

arr[-2]等于-2[arr]

Chr*_*son 131

-2[arr]被解析为-(2[arr]).在C(和C++,忽略重载)中,X[Y]is 的定义*(X+Y)(参见本问题对此的更多讨论),这意味着它2[arr]等于arr[2].

  • C/C++操作顺序很简单:`*`在`+`之前,对于其他一切,使用括号. (46认同)
  • 您只需要记住我猜的运算符优先级规则.或者只是不要使用这种令人困惑的结构...... (45认同)
  • @DeiDei不管怎样做`(-2)[arr]`是不错的做法.;) (15认同)
  • @Yakk:尊重,垃圾.你真的会写`(arr [2])+(arr [3])`?(理由是你不记得+的优先级是否高于[]).或者`((ptr-> a)[2])+((ptr-> a)[0]`.我也认为在与`||'或`&&'结合时将括号括在比较中是没有意义的(但我接受这是更有争议的). (7认同)
  • @MartinBonner很确定这是个玩笑 (6认同)
  • @LordOfThePigs它分解为指针算术.`pointer + offset` =`offset + pointer`你可以自己尝试使用不同的`arrayelement`s,例如使用`char arrayc []`和`int arrayi []`并观察输出.偏移量的"隐藏"`sizeof`倍数由编译器透明处理. (2认同)

Vla*_*cow 67

编译器解析此表达式

-2
Run Code Online (Sandbox Code Playgroud)

喜欢

unary_minus decimal_integer_literal
Run Code Online (Sandbox Code Playgroud)

这是整数文字的定义,不包括符号.

反过来表达

2[arr]
Run Code Online (Sandbox Code Playgroud)

由编译器解析为后缀表达式.

后缀表达式的优先级高于一元表达式.这样表达

-2[arr]
Run Code Online (Sandbox Code Playgroud)

相当于

- ( 2[arr] )
Run Code Online (Sandbox Code Playgroud)

因此,一元减号应用于后缀表达式返回的左值2[arr].

另一方面,如果你写的

int n = -2;
Run Code Online (Sandbox Code Playgroud)

然后

n[arr]
Run Code Online (Sandbox Code Playgroud)

那么这个表达就相当于

arr[-2]
Run Code Online (Sandbox Code Playgroud)

  • @Gizmo虽然与其他地方的一些陈述相反,数组DO作为C中的单独数据结构存在,但是在*数组内访问数据*的方法基本上限于使用它们的衰减特征到指针.所以当你在大多数情况下引用`a`时,你的意思是"指向数组a的第一个元素的指针".所以要获得你想要的实际元素`*a`.要获得第二个元素,你需要`*(a + 1)`.这是一个相当丑陋和笨拙的结构,因此C为上述提供了"a [1]"作为语法糖.由于`a + 1` ==`1 + a`,`1 [a]`==`a [1]`.在C++中,您可以将此重载更加混乱. (20认同)
  • 这怎么可能在c ++中?因为当'a [b]`等于'b [a]`时,我从来不知道这个,为什么要用这个呢?我在哪里可以阅读,因为我无法确定如何调用它 (9认同)
  • @Gizmo这个问题还有一些信息[有了数组,为什么会出现\ [5 \] == 5\[a \]?](/sf/ask/26707971/ - 为什么-是-IT-的情况 - 即-a5-5a) (9认同)

nal*_*zok 18

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

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

  • @ wizzwizz4答案是对的.`-2 [arr]`不是'A [B]`形式,因为优先级.因为它像` - (2 [arr])`那样解析,所以parens打破你的'A`并且你的论证不适用.如果确实如此,那么你可以声称"2*3 + 4"等于"2*4 + 3",因为"3 + 4"等于"4 + 3". (9认同)