2016-12-30 88 views
2
#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;爲什麼它工作?它的語法是什麼?

+2

只是因爲它的作品,並不意味着你應該使用它。 – DeiDei

+1

僅僅因爲你不應該使用它,並不意味着你不應該問它爲什麼會起作用。 – rightfold

+1

只是因爲我問爲什麼它的作品,我想出來謝謝大家! – neo1218

回答

7

a[b]由於是*(a + b)b[a]*(b + a),並+是可交換的。

除非重載和其他shenanigans。

3

數組索引是累積性的。見thisthis

在你的情況下,窄字符文字基本上是const字符數組。這使得:

cout << 2["abc"] << endl; 

一樣

cout << "abc"[2] << endl; 

爲了部分報價(重點礦山):

[lex.string/8]

...窄字符串字面量的類型爲「N常量字符的數組」 ...

[expr.sub/1]

後綴表達式,隨後在方括號中的表達式爲 後綴表達式。 表達式的一個應類型的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 
相關問題