为什么这样做?不合逻辑的阵列访问

unt*_*927 37 c++ syntax

我的一个朋友第一次学习C++,并发给我这个片段:

int foo[] = { 3, 38, 38, 0, 19, 21, 3, 11, 19, 42 };
char bar[] = " abcdefghijklmnopqrstuvwxyz01234567890+-,.!?-_";
for (int i = 0; i < 10; ++i) {
  std::cout << foo[i][bar];
}
Run Code Online (Sandbox Code Playgroud)

乍一看,我告诉他它不会工作 - 我认为它不会编译,或者至少会导致访问冲突,因为foo它不是一个二维数组,他回答说它确实如此.

我为自己试了一下,令我惊讶的是,这个片段完全没问题.问题是:为什么?

根据逻辑,常识和良好实践,语法应该是bar[foo[i]].

我很惭愧地承认我不知道发生了什么.foo[i][bar]在这种情况下,什么使有效的语法?

Ada*_*ght 41

简单来说,数组元素在C(和C++中,[]不重载时)的访问如下:

x[i] = *(x + i)
Run Code Online (Sandbox Code Playgroud)

所以,用这个和一点算术......

  foo[i][bar]
= (foo[i])[bar]
= (*(foo + i))[bar]
= *((*(foo + i)) + bar)
= *(bar + (*(foo + i)))
= bar[*(foo + i)]
= bar[foo[i]]
Run Code Online (Sandbox Code Playgroud)

不要使用这个"事实".正如您所见,它使代码无法读取,并且无法读取的代码无法维护.

  • 这是一个较短的证明: `foo[i][bar]` = `(foo[i])[bar]` = `*(foo[i] + bar)` = `*(bar + foo[i])` = `酒吧[foo[i]]` (7认同)