【C++深度剖析教程18】逗号操作符的分析
今天來學習C++中的逗號操作符。那么什么是逗號操作符呢?
*逗號操作符(,)可以構成逗號表達式
- 逗號表達式用于將多個子表達式連接為一個表達式
- 逗號表達式的值為最后一個子表達式的值
- 逗號表達式的前N-1個表達式的值可以沒有返回值
逗號表達式按照從左向右的順序計算每個表達式的值
exp1,exp2,……,expn-1,expn
下面我們還是以一個例子來說明逗號表達式概念與性質:
#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), //注意,這里的二維數組的初始化用的是(),而不是{},所以里面的內容構成逗號表達式(0,1,2)的值就為2.(3,4,5), //(3,4,5)的值為5(6,7,8) //(6,7,8)的值為8,所以這個數組實際上,只初始化了前三個數,后面的數全為0;};int i = 0;int j = 0;while(i < 5)func(i), /*注意這里是逗號,而不是分號,所以這個表達式等同于{func(i);i++}*/i++;for(i=0;i<3;i++){for(j=0;j<3;j++){cout << a[i][j] << endl;}}(i,j) = 6; //此處給逗號表達式賦值,實際上是給j賦值,而i值不變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
由運行結果,以及程序內容的分析,得以驗證上面所說的逗號表達式的性質。
那么,我們來試一下逗號表達式的重載,看看會出現什么結果:
#include <iostream> #include <string>using namespace std;class Test {int mValue; public:Test(int i){mValue = i;}int Value(){return mValue;} };Test func(Test& i) {cout << "func() : i = " << i.Value() << endl;return i; }Test& operator , (const Test& a, const Test& b) //重載逗號操作符 {return const_cast<Test&>(b); }int main() {Test t0(0);Test t1(1);Test tt = (func(t0),func(t1));cout << tt.Value() << endl;return 0; }運行結果:
func() : i = 1
func() : i = 0
1
由程序的分析,以及運行結果得知,我們的逗號操作符確實是返回的是最后一個子表達式的值,但是有一點,卻變了,子表達式的運行的次序,可以看出,是先運行func(t1),后運行func(t0),這是為什么呢?
問題本質的分析:
而當我們把上面的重載函數去掉,不用重載的逗號表達式,直接用原有的逗號表達式,結果就是:
func() : i = 0
func() : i = 1
1
總結:
- 逗號表達式從左向右計算子表達式的值
- 逗號表達式的值為最后一個子表達式的值
- 操作符重載無法實現逗號操作符的原生語義
- 工程開發中不要重載逗號操作符
想一起探討以及獲得各種學習資源加我(有我博客中寫的代碼的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流關于嵌入式,操作系統,C++語言,C語言,數據結構等技術問題。
總結
以上是生活随笔為你收集整理的【C++深度剖析教程18】逗号操作符的分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网晚报 | 8月29日 星期日 |
- 下一篇: 【C语言进阶深度学习记录】二十四 指针