在gcc上发布了一个patch,它提供了一个名为向g ++(gcc已经拥有它)的向量下标的东西。
如果a
是一个数组且i
是一个int,那么i[a]
是合法的并且等于a[i]
。
double a[]{0.0, 1.0, 2.0, 3.0}; // C++11 style but would work in C++98 style too.
assert(a[2] == 2.0);
assert(2[a] == 2.0);
那么,这是合法的标准C / C ++还是gcc扩展?
实际上,谷歌显示MS Developer Studio也有这个。我查看了C ++标准但是没有看到它。
答案 0 :(得分:11)
补丁与i[a]
等同于a[i]
无关;两种语言都是如此。除非涉及用户定义的类型,否则a[i]
被定义为等同于*(a+i)
,并且加法是可交换的。
补丁涉及vector datatypes(不要与C ++ std::vector
类模板混淆),这是一种支持向量处理指令的GCC语言扩展。根据补丁说明,它们可以像C中的数组一样订阅,但不是C ++,这个补丁将该功能添加到C ++中。
答案 1 :(得分:5)
在C中,这是因为a[b]
相当于*(a + b)
,因为+
commutative当然与*(b + a)
相同
答案 2 :(得分:3)
是的,这是合法的,因为矢量元素在标准内存中是连续的。
请注意:
a[i] == i[a] == *(a+i)