首頁 > 軟體

C++超詳細講解逗號操作符

2022-05-31 14:00:44

一、逗號操作符

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

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

下面看一個逗號表示式的範例:

#include <iostream>
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)
    };
    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;
}

輸出結果如下:

注意三點:

1.使用括號,就不是初始化的方式,就變成了逗號表示式。要想其變成真正的初始化語句,需要把圓括號改成花括號。即

   int a[3][3] = {
        {0, 1, 2},
        {3, 4, 5},
        {6, 7, 8}
    };

2.這個

while(i < 5)
        func(i),
    i++;

等價於

while(i < 5)
{
    func(i);
    i++; 
}

3.(i, j) = 6; 按照逗號表示式的規則,就是等價於 j = 6;

二、過載逗號操作符

  • 在C++ 中過載逗號操作符是合法的
  • 使用全域性函數對逗號操作符進行過載
  • 過載函數的引數必須有一個是類型別
  • 過載函數的返回值型別必須是參照

下面來嘗試一下過載逗號操作符:

#include <iostream>
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));
    cout << tt.value() << endl;
    return 0;
}

輸出結果如下:

其中

Test tt = (func(t0), func(t1));

等價於:

Test tt = (operator , (func(t0), func(t1)));

問題的本質分析

  • C++ 通過函數呼叫擴充套件操作符的功能
  • 進入函數體前必須完成所有引數的計算
  • 函數引數的計算次序是不定的
  • 過載後無法嚴格從左向右計算表示式

可以看一下不過載會輸出什麼,把下面這段註釋掉。

Test& operator , (const Test& a, const Test& b)
{
    return const_cast<Test&>(b);
}

輸出如下:

可以看到不過載逗號操作符是按照從左到右執行,過載後反而不正常了,所以逗號操作符沒有過載的必要。

注意事項:工程中不要過載逗號操作符!!!

三、小結

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

到此這篇關於C++超詳細講解逗號操作符的文章就介紹到這了,更多相關C++逗號操作符內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com