2014-02-11 51 views
0

一个发现下面的代码片段:这个C++代码是否产生未定义的行为?

int a[100]; 
... 
int value = 42[a]; 

这似乎做什么a[42]一样。

它是一个未定义的行为或完全合法的C++代码的虚假?

+1

@TemplateRex:除非您已经知道答案,否则需要时间才能找到这种答案。 –

回答

8

这是完全合法的。使用指针算术,a[42]相当于*(a + 42),其中(加法是可交换的)相当于*(42+ a),其(按定义[])等于42[a]

所以它是模糊的,但明确的。

+0

只是一个小问题:它在C++ **中是否完全合法**,而不仅仅是在C中,但仍然在C++中工作,因为遗留问题? – JBL

+0

@JBL在问题中或在我的答案中,我没有看到C的单个提及。这是完全合法的C++。 – Angew

+0

是的,我知道,但只是想知道。尽管如此,我还是在§5.2.1/ 1中发现了我正在寻找的东西(它与C中的完全相同)。不知道为什么我以某种方式认为它是不同的......我的错误。 – JBL

5

数组运算符是可交换

a[n] == *(a + n) == *(n + a) == n[a]

而且它是完全合法的。

+0

这是否意味着''a''总是被当作指针处理​​? –

+2

@SergeyK。不。它意味着在某些适用于指针的操作中,不适用于数组,而'a'被视为指针。在其他一些操作中,例如'sizeof(a)'或'&a',它不是。 @ᴍarounᴍaroun - 不,他们不是。 (响应于数组是常量指针的已删除注释) –

3

a[i]定义为*(a+i)

所以42[a] = a[42];,它是绝对安全的

1

42[a]是完全等同于a[42],并完全合法。它的工作原理是因为指针地址只是一个下面的整数,所以你可以做任何一种算法(一个数组变量实际上只是一个伪装的指针)。

尽管可读性通常不是好主意,除非您故意尝试混淆代码。

相关问题