首頁>Club>
7
回覆列表
  • 1 # 使用者1465424935672

    ①首先:

    cout是什麼?是一個類的例項化物件(某種流型別的)。

    ②其次:

    如果我們把operator

    那麼 cout

    等效於 ((cout.func(a)).func(function(x))).func(endl);

    我問你一個你一定知道答案的問題:

    int a=1;

    cout

    你肯定知道是12.(在devC++下是10,但是這個不用管,因為devC++下這是個BUG,你應該用更穩定支援C++的VC10去試它)

    如果你不知道為什麼是12,那麼是因為這個表示式先執行了三次++a,再輸出a+a+a。

    這就是C++語法中俗稱的“前副作用”,就是在“整個”表示式執行之前就運算完成的。

    ④最後:

    ((cout.func(a)).func(function(x))).func(endl); 是一個表示式整體,

    C++先會把所有優先順序最高的運算先執行:

    我們模擬一下編譯器:

    讀到 cout.func(a) 此時a是最高優先順序表示式,

    但是a已經是變數本身,

    所以跳過去找另一個高優先的表示式(注意,此時不是直接執行cout.func(a))

    接著是.func(function(x)),

    注意,第二個func是不能在第一個func之前先執行的,

    但是實參卻需要先執行,所以是執行function(x),接著再執行endl(其實不用執行,因為endl已經是最小粒度表示式)。

    此時再回頭執行第一個func,返回一個物件,接著呼叫這個返回了的物件的func(第二個func)。

    所以表示式((cout.func(a)).func(function(x))).func(endl);

    等效於以下語句:

    a; => 結果是變數a (此時a沒有壓棧或者說沒有被傳入func函式)

    x; => 結果是變數x

    function(x); => 返回結果假設是K

    endl; =>結果是endl

    cout.func(a); => 結果是返回一個物件C

    C.func(K); => 結果是返回一個物件C2

    C2.func(endl); => 結果是返回一個物件C3

    C++和C不同,C的 printf("%d",(++a)+(++a)+(++a)); 等效於 printf("%d",(1+a)+(2+a)+(3+a));

    這是由於C編譯器用的是比較古老的編譯器設計觀念。

    還有最後一點,C++這種特性到逗號表示式(不包括實參列表)為止為最小粒度。

    我們把((cout.func(a)).func(function(x))).func(endl); 改為:

    ((cout.func(a)).func(function(x))).func(endl),++a;

    後面的++a不會影響前面的函式呼叫。

    而((cout.func(a)).func(function(++a))).func(endl);

    會影響。

    這就是因為逗號表示式是最小表示式粒度的原因 。

    ⑤ 不知道你理解沒有,沒有+Q 739227481

  • 中秋節和大豐收的關聯?
  • 舌胎白厚有口臭,下巴和臉頰兩邊有很愛長痘痘?