C++ C+中的两种矩阵输出+;

C++ C+中的两种矩阵输出+;,c++,C++,我在不同的编译器中尝试了很多次,但都得到了相同的结果。我的问题是: 在C++中,给出了 int a(10);作为a的声明,则a[0]和0[a]的含义相同。我声称: cout << a[0]; cout因为数组索引操作在内部被解释为*(a+i)因为数组索引操作在内部被解释为*(a+i)让我声明一个数组:inta[10]Nowa表示数组在内存中的起始位置的某个内存地址,您可以将索引视为该内存地址的偏移量 因此,当将索引操作应用于数组时,值的定义如下:a[i]=*(a+i)通过加法的交

我在不同的编译器中尝试了很多次,但都得到了相同的结果。我的问题是:

在C++中,给出了<代码> int a(10);
作为
a
的声明,则
a[0]
0[a]
的含义相同。我声称:

cout << a[0]; 

cout因为数组索引操作在内部被解释为
*(a+i)

因为数组索引操作在内部被解释为
*(a+i)

让我声明一个数组:
inta[10]
Now
a
表示数组在内存中的起始位置的某个内存地址,您可以将索引视为该内存地址的偏移量


因此,当将索引操作应用于数组时,值的定义如下:
a[i]=*(a+i)
通过加法的交换属性,您可以看到
a[0]=0[a]
,这是因为语言如何定义索引操作。

假设我声明一个数组:
int a[10]
Now
a
表示数组在内存中的起始位置的某个内存地址,您可以将索引视为该内存地址的偏移量



因此,当将索引操作应用于数组时,值的定义如下:
a[i]=*(a+i)
通过加法的交换属性,您可以看到
a[0]=0[a]
,因为索引操作是由语言定义的。

而不仅仅是解释的;语言定义中就是这样定义它们的。@Pete:但仅限于内置类型。@BenVoigt-一旦进入用户定义类型,原始标识也不再适用。但我们不要把这个基本正确的答案拖进一个技术性的大鼠坑里。@Pete:另一方面,这个问题被标记为
c++
,而不是
c
,所以一个包含用户定义类型(或至少说明其限制)的答案可能是好的。因此,a[i]=i[a]意味着速度,而不仅仅是解释速度;语言定义中就是这样定义它们的。@Pete:但仅限于内置类型。@BenVoigt-一旦进入用户定义类型,原始标识也不再适用。但我们不要把这个本质上正确的答案拖进一个技术性的大鼠坑里。@Pete:另一方面,这个问题被标记为
c++
,而不是
c
,因此一个包含用户定义类型(或至少说明其限制)的答案可能是好的。因此,a[i]=i[a]表示cout
a
的速度可以使用地址实现,但它不是指针。然而,在这种情况下,它确实会退化为一。那么它是什么呢?我一直认为它是数组的第一个元素的地址a
是一个数组。它的类型是
int[10]
而不是
int*
。它的大小是
10*sizeof(int)
而不是
sizeof(int*)
。只是出于好奇,那么a的值是什么?a的值是整个数组。但是有一个从数组类型到指针类型的隐式转换,所以可以在任何可以使用指针的地方使用它。这种区别出现在
sizeof
这样的情况下,它同时适用于数组和指针,并且由于数组情况不需要转换,编译器会更喜欢它。
a
可以使用地址实现,但它不是指针。然而,在这种情况下,它确实会退化为一。那么它是什么呢?我一直认为它是数组的第一个元素的地址a
是一个数组。它的类型是
int[10]
而不是
int*
。它的大小是
10*sizeof(int)
而不是
sizeof(int*)
。只是出于好奇,那么a的值是什么?a的值是整个数组。但是有一个从数组类型到指针类型的隐式转换,所以可以在任何可以使用指针的地方使用它。这种区别出现在
sizeof
这样的情况下,它同时适用于数组和指针,而且由于数组情况不需要转换,编译器会更喜欢它。也许你最好说
a
是什么类型。因为。好的)让我们假设int a[10];也许你最好也说一下
a
是什么类型。因为。好的)让我们假设int a[10];
cout << 0[a];