Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是C++;-标准_C++_Arrays_Pointers_Syntax_Subscript Operator - Fatal编程技术网

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]
)的人都应该在被发现后立即被枪杀。它的唯一用途是代码混淆。