3 回答

TA貢獻883條經(jīng)驗 獲得超454個贊
cout?<<?"sdafa"?<<?a[9]?<<?endl; ?這個復合表達式中是連續(xù)三次 operator<< 函數(shù)調(diào)用。
C++ 語言明確規(guī)定了運算符的運算順序。重載運算符的運算順序也會按照這個順序來執(zhí)行(<< 運算符從左到右運算),所以肯定會是先執(zhí)行 <<?"sdafa"、再 <<?a[9]、最后 <<?endl。 ?請注意,這個順序指的是運算符的運算順序,也就是 << 函數(shù)的調(diào)用順序,和?"sdafa"、a[9] 什么的沒關系。 ? 那?"sdafa"、a[9] 是什么? 它們是運算符的操作數(shù)。
但是:C++語言沒有規(guī)定操作數(shù)的求值順序!?你的例子中?a[9] 是操作數(shù),并且你重載了 [] 運算符,那么所謂“a[9] 的求值”就是調(diào)用 a[9] 這個函數(shù)。 這個 a[9] 函數(shù)是什么時候調(diào)用的呢? 是在執(zhí)行?<<?a[9] 時才調(diào)用的嗎? ?答案是:不知道! C++ 并不保證一定會在執(zhí)行這個?<<?a[9] 函數(shù)時才調(diào)用 a[9] 函數(shù),<<?a[9] 這個函數(shù)需要的參數(shù)是?a[9] 的返回值,只要在執(zhí)行 << 函數(shù)前獲得這個返回值就可以了,也就是說 a[9] 只要在這之前被調(diào)用計算出返回值就可以。 甚至 a[9] 的調(diào)用可能比?<<?"sdafa" 函數(shù)的調(diào)用時間更早(在你的這個例子中似乎確實是這樣)。
你重載運算符 [] 并不只是簡單地返回一個值,還有可能輸出一個?"mistake"。 那么結合程序的運行結果,你應該可以推斷出來,這個 a[9] 的調(diào)用時間要早于?<<?"sdafa" 的調(diào)用時間,所以會先輸出了"mistake"。
再強調(diào)一下:僅僅是 a[9] 的調(diào)用時間不確定,而 << 運算符函數(shù)的調(diào)用順序是確定的(一定是先 <<?"sdafa"、再?<<?a[9]、最后?<<?endl),所以在輸出 a[9] 的返回值之前一定是先輸出了 "sdafa",最后再輸出 endl(也就是換行)的。


TA貢獻143條經(jīng)驗 獲得超187個贊
cout參數(shù)入棧的順序是從右到左...例如cin < <a < <b < <c;在棧中的位置如下:c-b-a.. <-(棧指針);但是輸出是從棧指針的位置開始的,意思即這時的輸出順序仍然是abc,而你的[]已經(jīng)重載了,所以里面的輸出提前輸出了,而return又是本來的順序
- 3 回答
- 1 關注
- 1753 瀏覽
添加回答
舉報