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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C++輸出順序的問題

C++輸出順序的問題

C++
慕粉18341035298 2017-03-27 22:23:38
代碼如下我的問題是為什么輸出結果是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貢獻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(也就是換行)的。

查看完整回答
1 反對 回復 2017-03-29
?
asd8532

TA貢獻143條經(jīng)驗 獲得超187個贊

cout參數(shù)入棧的順序是從右到左...例如cin < <a < <b < <c;在棧中的位置如下:c-b-a.. <-(棧指針);但是輸出是從棧指針的位置開始的,意思即這時的輸出順序仍然是abc,而你的[]已經(jīng)重載了,所以里面的輸出提前輸出了,而return又是本來的順序

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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號