这段代码是如何工作的还不清楚
int a[] = {4, 5, 2, 3, 1};
int i = *a;
for (;i;)
{
std::cout << i--[a]; // не понятная строчка
}
// output: 1325
减量适用于什么?
i好吧,很明显,一旦循环结束,变量。
但是如何访问数组元素呢?为什么没有编译错误?
人生第一次遇到这样的代码
这段代码是如何工作的还不清楚
int a[] = {4, 5, 2, 3, 1};
int i = *a;
for (;i;)
{
std::cout << i--[a]; // не понятная строчка
}
// output: 1325
减量适用于什么?
i好吧,很明显,一旦循环结束,变量。
但是如何访问数组元素呢?为什么没有编译错误?
人生第一次遇到这样的代码
这里使用减量,
i仅仅是因为它不能应用于此表示法中的任何其他内容——在它的右边有一个 lexeme[,它不能是操作数表达式的开头。等价的主题
a[i]完全是i[a]陈词滥调。x[y]根据定义,表达式只是 的简写符号*(x + y)。一个操作数必须是数组/指针,另一个必须是整数或枚举值。此外,对指定操作数的顺序没有限制。因此你i--[a]的相当于*(i-- + a)equivalent*(a + i--)和 equivalent toa[i--]。这里没有“编译错误”。以上仅适用于内置operator
[]。对于重载运算符,[]参数的顺序是固定的,即x[y],表达式只会考虑重载变体x.operator[](y),而不会考虑y.operator[](x)。索引运算符属于后缀运算符类。定义如下(C++标准,第5.2.1节下标)
也就是说,后缀表达式后跟方括号中的表达式。
在这个表达式中
i--是后置自减运算符,属于后缀表达式类。所以有所以从语法的角度来看,这个表达式是绝对正确的。
在标准的同一引述中还有一个延续
这意味着其中一个表达式必须是数组或指针,而另一个表达式必须是枚举或整数类型。这两个表达式中的哪一个应该具有类型并不重要,因为根据定义,表达式
E1[E2]等同于表达式*((E1) + (E2))。在 C++ 中,您可以通过在数组名称前添加一个加号来编写更高级的结构。例如,
在 C 中,此构造
i++[+a]不会编译,因为在 C 中,与 C++ 不同,您不能在数组名称上使用一元加号。在 C++ 中,用户还可以为花括号内的初始化列表重载索引运算符。例如,
将程序输出到控制台