#include <iostream>
using namespace std;
int main(void) {
cout << 2["abc"] << endl;
return 0;
}
$ g++ test.cpp -o test
$ ./test
c
C++语法是什么?为什么它工作?有人可以解释吗?cout << 2 [“abc”] << endl;为什么它工作?它的语法是什么?
#include <iostream>
using namespace std;
int main(void) {
cout << 2["abc"] << endl;
return 0;
}
$ g++ test.cpp -o test
$ ./test
c
C++语法是什么?为什么它工作?有人可以解释吗?cout << 2 [“abc”] << endl;为什么它工作?它的语法是什么?
a[b]
由于是*(a + b)
和b[a]
是*(b + a)
,并+
是可交换的。
除非重载和其他shenanigans。
在你的情况下,窄字符文字基本上是const字符数组。这使得:
cout << 2["abc"] << endl;
一样
cout << "abc"[2] << endl;
为了部分报价(重点矿山):
...窄字符串字面量的类型为“N常量字符的数组” ...
后缀表达式,随后在方括号中的表达式为 后缀表达式。 表达式的一个应类型的glvalue “阵列T的”或类型的“指针T”一个prvalue和其他应无作用域枚举或积分型的prvalue。其结果是“T”型的 ....
注:它仅适用于数组。当你这样做:
struct Foo
{
Foo& operator[](std::size_t index) { return *this; }
};
Foo foo;
下面将工作,因为它实际上呼吁foo.operator[] (2)
;
Foo f;
f[2]; //Calls foo.operator[] (2);
下面不会工作,因为,其中的一个表达式是不阵列,因此编译器进行到找到一个合适的2.operator[] (foo)
,这会失败,因为整型没有成员函数。
2[f]; //will not work
只是因为它的作品,并不意味着你应该使用它。 – DeiDei
仅仅因为你不应该使用它,并不意味着你不应该问它为什么会起作用。 – rightfold
只是因为我问为什么它的作品,我想出来谢谢大家! – neo1218