C++筆記 第三十九課 逗號操作符的分析---狄泰學院
阿新 • • 發佈:2018-11-23
如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux
第三十九課 逗號操作符的分析
1.逗號操作符
逗號操作符(,)可以構成逗號表示式
逗號表示式用於將多個子表示式連線為一個表示式
逗號表示式的值為最後一個子表示式的值
逗號表示式中的前N-1個子表示式可以沒有返回值
逗號表示式按照從左向右的順序計算每個子表示式的值
exp1,exp2,exp3,。。。,expN
39-1 逗號表示式的示例
#include <iostream> #include <string> using namespace std; void func(int i) { cout << "func() : i = " << i << endl; } int main() { int a[3][3] = { (0, 1, 2), (3, 4, 5), (6, 7, 8) }; /*此處(0,1,2)為逗號表示式,所以()最終的值為2,之後依次是5,8,若想要此處原樣輸出,則應改為花括號即可 {0, 1, 2}, {3, 4, 5}, {6, 7, 8} */ int i = 0; int j = 0; while( i < 5 ) func(i), i++; for(i=0; i<3; i++) { for(j=0; j<3; j++) { cout << a[i][j] << endl; } } (i, j) = 6;//此處也是逗號表示式 cout << "i = " << i << endl; cout << "j = " << j << endl; return 0; } 執行結果 func() : i = 0 func() : i = 1 func() : i = 2 func() : i = 3 func() : i = 4 2 5 8 0 0 0 0 0 0 i = 3 j = 6
2.過載逗號操作符
在C++中過載逗號操作符是合法的
使用全域性函式對逗號操作符進行過載
過載函式的引數必須有一個是類型別
過載函式的返回值型別必須是引用
39-2 過載逗號操作符
#include <iostream> #include <string> using namespace std; class Test { int mValue; public: Test(int i) { mValue = i; } int value() { return mValue; } }; /* Test& operator , (const Test& a, const Test& b) { return const_cast<Test&>(b); } */ Test func(Test& i) { cout << "func() : i = " << i.value() << endl; return i; } int main() { Test t0(0); Test t1(1); Test tt = (func(t0), func(t1)); // Test tt = func(t1); cout << tt.value() << endl; // 1 return 0; }
問題的本質分析
1.C++通過函式呼叫擴充套件操作符的功能
2.進入函式體前必須完成所有引數的計算
3.函式引數的計算次序是不定的
4.過載後無法嚴格從左向右計算表示式
工程中不要過載逗號操作符!
小結
逗號表示式從左向右順序計算每個子表示式的值
逗號表示式的值為最後一個子表示式的值
操作符過載無法完全實現逗號操作符的原生意義
工程開發中不要過載逗號操作符