#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