第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

C++輸出順序的問(wèn)題

C++輸出順序的問(wèn)題

C++
慕粉18341035298 2017-03-27 22:23:38
代碼如下我的問(wèn)題是為什么輸出結(jié)果是mistakesdafa-842150451而不是sdafamistakea[0]為什么先輸出mistake然后在sdafa后返回了a[0]而不是先輸出sdafa后輸出mistake 和a[0]#include<iostream> #include<cmath> using?namespace?std; class?arr{ public: arr(int?s?=?0); ~arr(); int?&?operator[](int?i); private: int?*p; int?size; }; arr::arr(int?s){ size?=?s; if?(size?==?0){ p?=?NULL; } else p?=?new?int[size?+?1]; for?(int?i?=?1;?i?<=?size;?i++) p[i]?=?0; } arr::~arr(){ if?(!p) delete[]?p; } int&?arr::operator[](int?i){ if?(i<1?||?i>size){ cout?<<?"mistake"?<<?endl; return?p[0]; } return?p[i]; } int?main(){ arr?a(5); cout?<<?"sdafa"?<<?a[9]?<<?endl; }
查看完整描述

3 回答

已采納
?
onemoo

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(也就是換行)的。

查看完整回答
1 反對(duì) 回復(fù) 2017-03-29
?
asd8532

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)的順序

查看完整回答
1 反對(duì) 回復(fù) 2017-03-28
  • onemoo
    onemoo
    你是認(rèn)真的嗎?! cout << a << b << c; 這是連續(xù)三次函數(shù)調(diào)用,每次只有一個(gè)參數(shù),這不是參數(shù)入棧的問(wèn)題啊。
  • asd8532
    asd8532
    主要是容易理解,雖然是無(wú)定義的行為不過(guò)一般都這么執(zhí)行,我對(duì)不起黨的培養(yǎng),我是非計(jì)算機(jī)專業(yè)的非計(jì)算機(jī)從業(yè)者
  • onemoo
    onemoo
    我也是野生程序員...
點(diǎn)擊展開(kāi)后面1
  • 3 回答
  • 1 關(guān)注
  • 1738 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)