①首先:
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
①首先:
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