逗號操作符(,)在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 ...