矢量下标标准C / C ++?

时间:2012-04-18 14:38:52

标签: c++ gcc g++

在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 ++标准但是没有看到它。

3 个答案:

答案 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)