if( vec.end() == vec.erase( vec.begin() , vec.end() ) )不一定為真!

來源:互聯網
上載者:User

if( vec.end() == vec.erase( vec.begin() , vec.end() ) )<br />

根據MSDN定義和VC的定義,這一樣運算式肯定是真的,

因為VC先計算erase(右運算式),返回的必然是end,然後再計算end(),傳回值與erase傳回值相同。

但是,實際上

DEBUG版本執行是真

RELEASE版本執行是假!

 

因為RELEASE版本中,vec.end()被最佳化掉了,成為一個先獲得的值,然後再計算erase,

而erase將會改變end的值

所以RELEASE版本要這樣寫才對:

iter = vec.erase( vec.begin() , vec.end() )<br />//上面強制先計算erase<br />if( vec.end() == iter )//此時再計算end()肯定相等<br />

 

第一個寫法犯了兩個嚴重錯誤錯誤:

1、靠經驗錯誤地假設邏輯操作時自右向左計算運算式的值(C++標準沒規定,就可能被最佳化掉)

2、誤以為end()傳回值是一個常量

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.