C 逗號操作符的含義以及過載

2021-10-05 13:32:50 字數 1539 閱讀 7935

逗號操作符(,)在c\c++中的原生語義:

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

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

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

4)逗號表示式按照從左到右的順序計算每個子表示式的值

例子:

#include #include using namespace std;

void func(int i)

int main()

所以變成了逗號表示式

(3, 4, 5),

(6, 7, 8)

};int i = 0;

int j = 0;

while( i < 5 )

func(i), //實際上等價於這樣 func(i),i++;

i++;

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

}(i, j) = 6; //等價於 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 = 425

8000

000i = 3

j = 6

#include #include using namespace std;

class test

int value()

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

test func(test& i)

int main()

執行結果

1

func() : i = 1

func() : i = 0

1

這裡我們可以看到,逗號運算子並沒有按照從左到右執行,違背了其原生語義。

那到底是什麼原因呢?

其實在上面的**對t4進行初始化時的**是

test t4 = (func(t0),func(t1));
等效於

test t4 = operator , (func(t0),func(t1));
在c/c++中,進入函式體之前,必須完成所有引數的計算,且引數的計算次序也是不確定。所以出現了這樣的執行結果。

最後我們做乙個小實驗,去除之前**中的逗號操作符過載,編譯執行,得到的結果如下:

1

func() : i = 0

func() : i = 1

1

結果正確,且編譯器沒有報錯,說明實際上編譯器就能處理包含物件的逗號操作符。過載逗號操作符是沒有意義的。

逗號操作符過載

逗號操作符語義 將多個子表示式連線為乙個表示式,整個表示式的值是最後乙個表示式的值。前 個表示式可以沒有返回值。從左到右計算每個子表示式的值。逗號操作的過載 使用全域性函式對逗號操作符進行過載。過載函式引數必須有乙個是類型別。過載函式返回值型別必須是引用。class operator const c...

C 語法小記 過載逗號操作符

過載逗號操作符 不建議過載逗號操作符 不能實現左到右依次計算每乙個表示式的值,過載之後為隨機順序,原因如下 不過載逗號操作符也可以進行逗號運算 結論 不建議過載逗號操作符 1 include 2 include 34 using namespace std 56 class test714 intv...

C 中逗號操作符過載的分析

1,關注逗號操作符過載後帶來的變化 2,逗號操作符 1,逗號操作符 可以構成都好表示式 exp1,exp2,exp3,expn 1,逗號表示式用於將多個表示式連線為乙個表示式 1,就是用來起連線不同語句作用的 2,逗號表示式的值為最後乙個子表示式的值 1,最後乙個必須有值 3,逗號表示式中的前 n ...