【C++深度剖析學習總結】 39 逗號操作符分析

【C++深度剖析學習總結】 39 逗號操作符分析

作者 CodeAllen ,轉載請註明出處


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

  • 逗號表達式用於將多個子表達式連接爲一個表達式
  • 逗號表達式的值爲最後一個子表達式的值
  • 逗號表達式中的前N-1個子表達式可以沒有返回值
  • 逗號表達式按照從左向右的順序計算每個子表達式的值

exp1,exp2,exp3,。。。,expN //從做向進行

實驗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 )     //不帶花括號,while的作用範圍就是後邊一行
        func(i),       //注意,這裏後邊的逗號相當於還有一天語句,也就是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++中重載逗號操作符是合法的
使用全局函數對逗號操作符進行重載
重載函數的參數必須有一個是類類型
重載函數的返回值類型必須是引用
在這裏插入圖片描述

實驗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;
}

輸出
func() : i = 1
func() : i = 0

註釋重載函數之後輸出,逗號原本的方式
func() : i = 0
func() : i = 1

本質分析
1.C++通過函數調用擴展操作符的功能
2.進入函數體前必須完成所有參數的計算
3.函數參數的計算次序是不定的
4.重載後無法嚴格從左向右計算表達式

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

小結
逗號表達式從左向右順序計算每個子表達式的值
逗號表達式的值爲最後一個子表達式的值
操作符重載無法完全實現逗號操作符的原生意義
工程開發中不要重載逗號操作符

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章