1. 程式人生 > >C++筆記 第三十九課 逗號操作符的分析---狄泰學院

C++筆記 第三十九課 逗號操作符的分析---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習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.過載後無法嚴格從左向右計算表示式
工程中不要過載逗號操作符!
小結
逗號表示式從左向右順序計算每個子表示式的值
逗號表示式的值為最後一個子表示式的值
操作符過載無法完全實現逗號操作符的原生意義
工程開發中不要過載逗號操作符