39 逗號操作符的分析

2021-10-24 09:24:27 字數 2423 閱讀 9880

注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。

測試環境:ubuntu 10.10

gcc版本:9.2.0

一、逗號操作符

1)逗號操作符(,)可以構成逗號表示式

-    逗號表示式用於將多個子表示式連線為乙個表示式

-    逗號表示式的值為最後乙個子表示式的值

-    逗號表示式中的前n-1個子表示式可以沒有返回值

-    逗號表示式按照從左向右的順序計算每個子表示式的值

exp1,exp2,exp3,……,expn

例項分析

逗號表示式的示例

39-1.cpp

#include #include using namespace std;

void func(int i)

int main()

; //這個二維陣列只有2,5,8三個初始值

/*//想初始化9個元素,需要用花括號({})

int a[3][3] = ,,};

*/int i = 0;

int j = 0;

while( i < 5 )

func(i),

i++; //26和28是同一行

//上邊是while

for(i=0; i<3; i++)

}(i, j) = 6; //等價於j = 6;i並沒有被賦值

cout << "i = " << i << endl;

cout << "j = " << j << endl;

return 0;

}

操作:

1) g++ 39-1.cpp -o 39-1.out編譯正確,列印結果:

func() : i = 0

func() : i = 1

func() : i = 2

func() : i = 3

func() : i = 4

2 //接下來三行,只顯示了最後數值,證明逗號表示式值為最後乙個子表示式值

5

8

0

0

00

0

0

i = 3

j = 6

分析:

列印i = 3,沒有等於6,證明i沒有被賦值。

二、過載逗號操作符

1)在c++中過載逗號操作符是合法的

2)使用全域性函式對逗號操作符進行過載

3)過載函式的引數必須有乙個是類型別

4)過載函式的返回值型別必須是引用

class& operator,(const class& a, const class& b)

函式返回值型別為引用是為了支援連續操作(沒有引用這裡只會是臨時物件,執行異常)。

程式設計實驗

過載逗號操作符

39-2.cpp

#include #include using namespace std;

class test

int value()

};/*

test& operator , (const test& a, const test& b)

*/test func(test& i)

int main()

操作:

1) g++ 39-2.cpp -o 39-2.out編譯正確,列印結果:

func() : i = 1

func() : i = 0

1

分析:

使用自定義的過載逗號(,)操作符函式,執行結果是從右至左(原生意思:從左至右),違背逗號表示式原生語義!引起重視。

2) 注釋掉自定義的過載逗號(,)操作符函式:

func() : i = 0

func() : i = 1

1

分析:

預設的逗號運算結果,從左至右呼叫函式。

結論:對比1)和2)發現,自定義的過載逗號操作符函式和預設的逗號執行順序不同,工程中不要過載使用。

5)問題的本質分析

1、c++通過函式呼叫擴充套件操作符的功能

2、進入函式體前必須完成所有引數的計算(函式和表示式作為形參時,進入函式體前都必須完成所有引數計算)

3、函式引數的計算次序是不定的

4、過載後無法嚴格從左向右計算表示式

工程中不要過載逗號操作符!

小結1)逗號表示式從左向右順序計算每個子表示式的值

2)逗號表示式的值為最後乙個子表示式的值

3)操作符過載無法完全實現逗號操作符的原生意義

4)工程開發中不要過載逗號操作符

C 39 逗號操作符分析

exp1,exp2,exp3,expn include include using namespace std void func int i int main int i 0 int j 0 while i 5 func i 注意這裡!i for i 0 i 3 i i,j 6 注意這裡!cout...

第39課 逗號操作符的分析

1.1 逗號表示式用於將多個子表示式連線為乙個表示式 1.2 逗號表示式的值為 最後乙個子表示式的值 1.3 逗號表示式的 前n 1個子表示式可以沒有返回值 1.4 逗號表示式按照 從左向右的順序 計算每個子表示式的值 exp1,exp2,exp3,expn 逗號表示式的示例 include usi...

逗號操作符

逗號操作符 可以構成逗號表示式 逗號表示式用於將多個子表示式連線為乙個表示式 逗號表示式的值為最後乙個子表示式的值 逗號表示式的前n 1個子表達 先來看乙個例子 include include using namespace std void func int i intmain int i 0 i...