我得到了這一點:爲什麼這個怪異的代碼工作?
int main(){
int Array[] = { 10, 20, 30 };
cout << -2[Array] << endl;
system("Pause");
return 0;
}
輸出是:
-30
我想知道爲什麼輸出爲-30,爲什麼會導致這種不確定的行爲?
有誰知道?
我得到了這一點:爲什麼這個怪異的代碼工作?
int main(){
int Array[] = { 10, 20, 30 };
cout << -2[Array] << endl;
system("Pause");
return 0;
}
輸出是:
-30
我想知道爲什麼輸出爲-30,爲什麼會導致這種不確定的行爲?
有誰知道?
這很簡單。
首先,讓我們分析的表達:
-2[Array]
是
-(2[Array])
現在a[b]
是*(a+b)
而且由於加法是可交換的,這也是*(b+a)
即Array[2]
。
Array[2]
是30
; -Array[2]
是-30
。因此,-2[Array]
也是-30
。
我真誠地希望你不打算在生產代碼中使用它。
謝謝!哈哈不,我不會這只是我的懷疑。 –
-2[Array]
被解析爲-(2[Array])
,因爲下標具有比一元減號更高的優先級。
現在,2[Array]
is just a weird way to write Array[2]
,所以你得到-Array[2]
,即-30。整個表達式中不涉及未定義的行爲。
在C++中,下面的語句爲真:
a[5] == 5[a]
這是因爲使用[]
語法轉換爲:
*(a + 5)
例如
a[5] == *(a + 5)
這意味着
5[a] == *(5 + a)
因此,符號-2[Array]
轉換爲- *(2 + Array)
。
它將一元運算符( - ,減號)應用於由[]之外的值遞增的指針,因此:- *(2 + Array)
。您可以通過刪除減號來檢查它,從而應用+一元運算符。我不會推薦使用這種語法。
它不「工作」。它調用未定義的行爲。 – Gene
感謝您的糾正,我會編輯問題! –
[使用C數組可能有重複,爲什麼會出現\ [5 \] == 5 \ [a \]?](http://stackoverflow.com/questions/381542/with-c-arrays-爲什麼是這樣的情況下,a5-5a) – milleniumbug