3 回答

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


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