2

向 gcc 发布了一个补丁,该补丁为 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++ 标准,但没有看到它。

4

3 回答 3

11

i[a]补丁与等同于a[i];无关。两种语言都是如此。除非涉及用户定义的类型,否则a[i]定义为等价于*(a+i),并且加法是可交换的。

该补丁涉及向量数据类型(不要与 C++std::vector类模板混淆),这是一种支持向量处理指令的 GCC 语言扩展。根据补丁说明,它们像 C 中的数组一样是可下标的,但 C++ 中不能,而且这个补丁将这个特性添加到了 C++ 中。

于 2012-04-18T14:44:17.387 回答
5

a[b]在 C 中,这源于等价于的事实,*(a + b)因为它+可交换的,当然与 相同*(b + a)

于 2012-04-18T14:42:19.337 回答
3

是的,这是合法的,因为矢量元素通过标准保证在内存中是连续的。

注意:

a[i] == i[a] == *(a+i)
于 2012-04-18T14:40:19.087 回答