C++超詳細(xì)講解逗號(hào)操作符
一、逗號(hào)操作符
逗號(hào)操符( , )可以構(gòu)成逗號(hào)表達(dá)式
- 逗號(hào)表達(dá)式用于將多個(gè)子表達(dá)式連接為一個(gè)表達(dá)式
- 逗號(hào)表達(dá)式的值為最后一個(gè)子表達(dá)式的值
- 逗號(hào)表達(dá)式中的前 N-1 個(gè)子表達(dá)式可以沒有返回值
- 逗號(hào)表達(dá)式按照從左向右的順序計(jì)算每個(gè)子表達(dá)式的值
下面看一個(gè)逗號(hào)表達(dá)式的示例:
#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; }
輸出結(jié)果如下:
注意三點(diǎn):
1.使用括號(hào),就不是初始化的方式,就變成了逗號(hào)表達(dá)式。要想其變成真正的初始化語句,需要把圓括號(hào)改成花括號(hào)。即
int a[3][3] = { {0, 1, 2}, {3, 4, 5}, {6, 7, 8} };
2.這個(gè)
while(i < 5) func(i), i++;
等價(jià)于
while(i < 5) { func(i); i++; }
3.(i, j) = 6; 按照逗號(hào)表達(dá)式的規(guī)則,就是等價(jià)于 j = 6;
二、重載逗號(hào)操作符
- 在C++ 中重載逗號(hào)操作符是合法的
- 使用全局函數(shù)對(duì)逗號(hào)操作符進(jìn)行重載
- 重載函數(shù)的參數(shù)必須有一個(gè)是類類型
- 重載函數(shù)的返回值類型必須是引用
下面來嘗試一下重載逗號(hào)操作符:
#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; }
輸出結(jié)果如下:
其中
Test tt = (func(t0), func(t1));
等價(jià)于:
Test tt = (operator , (func(t0), func(t1)));
問題的本質(zhì)分析
- C++ 通過函數(shù)調(diào)用擴(kuò)展操作符的功能
- 進(jìn)入函數(shù)體前必須完成所有參數(shù)的計(jì)算
- 函數(shù)參數(shù)的計(jì)算次序是不定的
- 重載后無法嚴(yán)格從左向右計(jì)算表達(dá)式
可以看一下不重載會(huì)輸出什么,把下面這段注釋掉。
Test& operator , (const Test& a, const Test& b) { return const_cast<Test&>(b); }
輸出如下:
可以看到不重載逗號(hào)操作符是按照從左到右執(zhí)行,重載后反而不正常了,所以逗號(hào)操作符沒有重載的必要。
注意事項(xiàng):工程中不要重載逗號(hào)操作符?。。?/p>
三、小結(jié)
- 逗號(hào)表達(dá)式從左向右順序計(jì)算每個(gè)子表達(dá)式的值
- 逗號(hào)表達(dá)式的值為最后一個(gè)子表達(dá)式的值
- 操作符重載無法完全實(shí)現(xiàn)逗號(hào)操作符的原生意義
- 工程開發(fā)中不要重載逗號(hào)操作符
到此這篇關(guān)于C++超詳細(xì)講解逗號(hào)操作符的文章就介紹到這了,更多相關(guān)C++逗號(hào)操作符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++ 類函數(shù)作為模板參數(shù)實(shí)現(xiàn)方式詳解
這篇文章主要介紹了c++ 類函數(shù)作為模板參數(shù)實(shí)現(xiàn)方式,在實(shí)現(xiàn)中加入增強(qiáng)邏輯,這種方式對(duì)代碼侵入性過高,而且無法控制該邏輯是否需要,如果不需要的話又得重新修改代碼實(shí)現(xiàn),需要的朋友可以參考下2023-03-03Linux C 時(shí)間函數(shù)應(yīng)用
本文是關(guān)于Linux C時(shí)間函數(shù) time_t struct tm 進(jìn)行了詳細(xì)的分析介紹并有應(yīng)用實(shí)例,希望能幫到有需要的同學(xué)2016-07-07QT網(wǎng)絡(luò)通信TCP客戶端實(shí)現(xiàn)詳解
這篇文章主要為大家詳細(xì)介紹了QT網(wǎng)絡(luò)通信TCP客戶端實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08C++實(shí)現(xiàn)json形式的Socket傳輸圖片
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)json形式的Socket傳輸圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03C++ LibCurl實(shí)現(xiàn)Web指紋識(shí)別功能
Web指紋識(shí)別是一種通過分析Web應(yīng)用程序的特征和元數(shù)據(jù),以確定應(yīng)用程序所使用的技術(shù)棧和配置的技術(shù),本文將通過C++中LibCurl庫實(shí)現(xiàn)簡(jiǎn)單是指紋識(shí)別功能,感興趣的可以了解下2023-11-11基于C++中常見內(nèi)存錯(cuò)誤的總結(jié)
本篇文章是對(duì)C++中常見的內(nèi)存錯(cuò)誤進(jìn)行了總結(jié)介紹。需要的朋友參考下2013-05-05