2016-04-23 57 views
0

我得到了這一點:爲什麼這個怪異的代碼工作?

int main(){ 
    int Array[] = { 10, 20, 30 }; 
    cout << -2[Array] << endl; 
    system("Pause"); 
    return 0; 

} 

輸出是:

-30

我想知道爲什麼輸出爲-30,爲什麼會導致這種不確定的行爲?

有誰知道?

+1

它不「工作」。它調用未定義的行爲。 – Gene

+0

感謝您的糾正,我會編輯問題! –

+4

[使用C數組可能有重複,爲什麼會出現\ [5 \] == 5 \ [a \]?](http://stackoverflow.com/questions/381542/with-c-arrays-爲什麼是這樣的情況下,a5-5a) – milleniumbug

回答

1

這很簡單。

首先,讓我們分析的表達:

-2[Array] 

-(2[Array]) 

現在a[b]*(a+b)而且由於加法是可交換的,這也是*(b+a)Array[2]

Array[2]30; -Array[2]-30。因此,-2[Array]也是-30

我真誠地希望你不打算在生產代碼中使用它。

+0

謝謝!哈哈不,我不會這只是我的懷疑。 –

3

-2[Array]被解析爲-(2[Array]),因爲下標具有比一元減號更高的優先級。

現在,2[Array] is just a weird way to write Array[2],所以你得到-Array[2],即-30。整個表達式中不涉及未定義的行爲。

0

在C++中,下面的語句爲真:

a[5] == 5[a] 

這是因爲使用[]語法轉換爲:

*(a + 5) 

例如

a[5] == *(a + 5) 

這意味着

5[a] == *(5 + a) 

因此,符號-2[Array]轉換爲- *(2 + Array)

0

它將一元運算符( - ,減號)應用於由[]之外的值遞增的指針,因此:- *(2 + Array)。您可以通過刪除減號來檢查它,從而應用+一元運算符。我不會推薦使用這種語法。

相關問題