2012-01-18 27 views
33

可能重复:
In C arrays why is this true? a[5] == 5[a]这为什么有效?不合逻辑的数组访问

我的一个朋友是学习C++的第一次,送我这个片段:

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

在一目了然,我告诉他它不会工作 - 我认为它不会编译,或者至少会导致访问冲突,因为foo不是二维数组,他回答说它是这样做的。

我为自己尝试过,令我惊讶的是,片段运行得非常好。问题是:为什么?

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

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

+16

这不是一个确切的重复,而且答案很有趣。这两个问题的根本原因都是一样的,但对于StackOverflow上的数百个问题,情况确实如此。 – 2012-01-18 13:33:46

+1

顺便说一句:我只会同意输出,如果我会做这些事情... – stefaanv 2012-01-18 16:06:27

+0

有趣的是,这个实际上是有道理的,如果一个人读取链接的问题,但仍然完全不合逻辑,因为它是当你不'不懂;不合逻辑的部分只是从“这项工作如何”转变为“他们为什么要让这项工作”。 – 2016-12-31 18:36:30

回答

35

在简单术语中,阵列元件的在C访问(在C++中,当[]未过载)如下:

x[i] = *(x + i) 

所以,与此和算术的一点点。 ..

foo[i][bar] 
= (foo[i])[bar] 
= (*(foo + i))[bar] 
= *((*(foo + i)) + bar) 
= *(bar + (*(foo + i))) 
= bar[*(foo + i)] 
= bar[foo[i]] 

虽然不要使用这个“事实”。正如你所看到的,它使得代码不可读,而不可读的代码是不可维护的。

相关问题