Does this C++ code produce an undefined behavior?
a找到了以下代码段:
1 2 3
| int a[100];
...
int value = 42[a]; |
这似乎正是a[42]所做的。
它是一个具有未定义行为的假象还是一个完全合法的C++代码?
- @圣殿骑士团:除非你已经知道答案,否则找到这种答案需要时间。
这是完全合法的。在指针运算中,a[42]相当于*(a + 42),其(加法是交换的)相当于*(42+ a),其(根据[]的定义)相当于42[a]。
所以它是模糊的,但定义明确。
- 只是一个小问题:它在C++中是完全合法的,而不仅仅是在C中,但还是因为C++而在C++中工作?
- @jbl我在问题或我的答案中没有看到一个提到c的地方。这是完全合法的C++。
- 是的,我知道,只是想知道。不过,我还是在&167;5.2.1/1中找到了我想要的(它和C中的完全一样)。不知道为什么我觉得这不一样…我的错误。
- @JBL我知道为什么:因为它是如此愚蠢的语言特性,似乎只存在于聪明的问题和困惑中。即使你知道它来自指针算术。
- 在ioccc.org的代码中,您会发现它经常被使用(在c中)。
- @斯坦法恩夫,我有点怀疑。实际上,语言是如何工作的,a[i]相当于*(a+i),只是i[a]是订阅如何工作的一个愚蠢的副作用(好吧,确切地说,它是加法交换性的副作用)。我不认为它只是为了"聪明的问题"而存在。/
- @很抱歉,讽刺(有点像詹姆斯的评论)。如果C/C++被重新设计,它就不应该在语言定义中,因为它只会增加混淆和类似这样的问题。无论如何,我认为这是一个很好的理由,为什么你被允许怀疑它是否合法在C++中。
数组运算符是可交换的。
埃多克斯1〔5〕
这是完全合法的。
- 这是否意味着a总是被视为指针?
- @谢尔盖。不。这意味着在某些适用于指针而不是数组的操作中,a被视为指针。在其他一些操作中,如sizeof(a)或&a,则不是这样。@?周围?阿伦——不,他们不是。(响应删除的数组是常量指针的注释)
a[i]定义为*(a+i)。
所以42[a]=a[42];是完全安全的
42[a]与a[42]完全相同,完全合法。它的工作原理是,指针地址只是下面的一个整数,所以您可以用任何一种方法来进行算术运算(数组变量实际上只是一个薄伪装的指针)。
不过,对于可读性来说,这通常不是一个好主意,除非您有意地试图混淆代码。