C++ 是C++;-标准
据我所知,可以编写以下代码:C++ 是C++;-标准,c++,arrays,pointers,syntax,subscript-operator,C++,Arrays,Pointers,Syntax,Subscript Operator,据我所知,可以编写以下代码: char *a = new char[50]; for (int i = 0; i < 50; ++i) { i[a] = '5'; } char*a=新字符[50]; 对于(int i=0;i
char *a = new char[50];
for (int i = 0; i < 50; ++i) {
i[a] = '5';
}
char*a=新字符[50];
对于(int i=0;i<50;++i){
i[a]=“5”;
}
它编译。它起作用了。它的功能与
char *a = new char[50];
for (int i = 0; i < 50; ++i) {
a[i] = '5';
}
char*a=新字符[50];
对于(int i=0;i<50;++i){
a[i]=“5”;
}
是否只是因为:
- 默认情况下,
被实现为一个宏a[b]
,两个代码样本都是有效的,这只是一个特定于事故/编译器的事实*(a+b)
- 它在某个地方是标准化的,这样的算法在每个平台上的结果应该是相同的
操作符[]
,我们已经使其他的东西可交换了,这可能不是我们想要的
有趣的事实是没有指针[pointer]
操作符,因此操作符[]
不是宏
我知道这很糟糕。我知道这让那些读代码的人感到困惑。但我想知道这是否只是一个意外,在一个遥远的地方,独角兽有七条腿,角在左脸颊上,它不会起作用
表达式E1[E2]根据定义与*((E1)+(E2))相同
…然后索引和指针的交换性就成立了。请参阅您的友好邻域C++标准,版本5.2.1:
除为类(13.5.5)声明的情况外,下标运算符[]
的解释方式应确保E1[E2]
与*((E1)+(E2))
相同。由于应用于+
的转换规则,如果E1
是一个数组,E2
是一个整数,那么E1[E2]
指的是E2
的第四个成员。因此,尽管其外观不对称,下标是一种交换操作
以下是C++11标准的内容: 注:除已为类(13.5.5)声明的情况外,下标运算符
[]
以这种方式解释
E1[E2]
的方式与*((E1)+(E2))
相同。由于适用于+的转换规则,如果E1
是
数组和E2
一个整数,则E1[E2]
指E2
的第四个成员。因此,尽管它是不对称的
从外观上看,订阅是一种交换操作。(增加了重点)
因此,您认为
a[b]
实现为*(a+b)
是正确的,只是它是直接在编译器中实现的,而不是宏。它不是宏,而是语言规则。我删除了C标记,因为它似乎更关注C++。请检查@Cool\u Coder:它之所以有效,是因为a[I]
=*(a+I)
=*(i+a)
=i[a]
@Cool\u Coder忘了它吧。任何访问数组中第一个元素(如0[a]
)的人都应该在被发现后立即被枪杀。它的唯一用途是代码混淆。