亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

cout<a+<a;的正確答案是什么?

cout<a+<a;的正確答案是什么?

C++ C
HUWWW 2019-07-20 12:36:34
cout<a+<a;的正確答案是什么?最近在一次采訪中,有一個下面的客觀類型的問題。int a = 0;cout << a++ << a;回答:a.10b.01C.未界定的行為我回答了選擇b,即輸出為“01”。但令我驚訝的是,后來一位面試官告訴我,正確的答案是選項c:未定?,F在,我知道了C+中序列點的概念。以下語句未定義此行為:int i = 0;i += i++ + i++;但根據我對聲明的理解cout << a++ << a,ostream.operator<<()會被調用兩次,第一次是ostream.operator<<(a++)后來ostream.operator<<(a).我還檢查了VS 2010編譯器的結果,它的輸出也是‘01’。
查看完整描述

3 回答

?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

你可以想到:

cout << a++ << a;

作為:

std::operator<<(std::operator<<(std::cout, a++), a);

C+保證以前的評價的所有副作用都是在序列點..函數參數計算之間沒有序列點,這意味著參數a可以在論證前進行評估std::operator<<(std::cout, a++)或者之后。因此,上述結果是未知的。


C+17更新

在C+17中,規則已經更新。特別是:

在移位運算符表達式中E1<<E2E1>>E2的每一個值計算和副作用E1的值計算和副作用之前對E2.

這意味著它需要代碼來生成結果。b,輸出01.

看見P0145R3修飾C+的表達式求值順序更多細節。


查看完整回答
反對 回復 2019-07-20
?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

序列點只定義部分點菜。在您的情況下,您已經(一旦完成了重載解決):

std::cout.operator<<( a++ ).operator<<( a );

之間有一個序列點。a++第一次打電話到std::ostream::operator<<,在第二個a第二個電話是std::ostream::operator<<,但之間沒有順序點。a++a;唯一的排序約束是a++在第一次調用之前對其進行全面評估(包括副作用)。operator<<,第二個a在第二個調用之前對其進行全面評估。operator<<..(也有一些謹慎的排序約束:第二個調用operator<<不能先于前者,因為它要求第一個結果作為一個參數。)§5/4(C+03)規定:

除注意到的情況外,未具體說明單個運算符操作數的計算順序和個別表達式的子表達式,以及產生副作用的順序。在前一個序列點和下一個序列點之間,標量對象最多應該通過表達式的計算修改其存儲值一次。此外,只能訪問先前的值來確定要存儲的值。對于一個完整表達式的子表達式的每一個允許的順序,都應滿足本款的要求;否則,該行為是不明確的。

表達式的允許順序之一是a++a,第一個呼叫operator<<,第二次呼叫operator<<;這將修改a (a++),并訪問它而不是確定新值(第二個a),行為是未定義的。


查看完整回答
反對 回復 2019-07-20
  • 3 回答
  • 0 關注
  • 872 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號