1. class mynum
2. 8. };
9. class someclass
10.
23. }
24. mynum num;
25. int a;
26. int b,c;
27. };
在這段**裡,逗號在5,13-16,18-20,27行都出現了。
現在先讓我們來看看c++逗號操作符是啥意思:
乙個包含逗號的表示式首先計算逗號左邊的表示式,然後計算逗號右邊的表示式;整個表示式的結果是逗號右邊表示式的值。
然後我們看看上面的**:
第5行是在mynum類的建構函式裡出現的逗號,只是用來區分開第乙個double型別的引數和後面的可變引數。這是乙個特例,如果在構造 mynum物件的時候,本來是要傳入3.4作為第乙個引數的,結果不小心把小數點變成了逗號的話,3.4就變成了兩個引數3和4——比如在第13行的情況。類似這樣的情況編譯器不會報錯,程式也能執行,但是mynum類裡的成員變數可能就因為建構函式傳入的變數值變化而導致程式執行結果完全不一致了。這兩個逗號都不是逗號操作符了。
第14,15,16行的逗號,也不是逗號操作符。這三個逗號只是用來間隔建構函式的成員變數初始化列表。
第18行的int i,j;是大家都很常用的變數宣告的語句,逗號在這裡,也只是起了乙個間隔變數宣告的作用,也不是逗號運算子。
第19行的逗號,如果不認識c++逗號操作符的話,一定會認為這肯定是寫錯了!其實這正是逗號操作符了。讓我們看看,經過i=1,2;這個語句後,i 的值應該是多少呢?按照之前逗號操作符的定義,我們好像可以很輕鬆的得出i=2。然而,這個答案是錯的!你在得出錯誤答案的時候,忽略了乙個重要的因素 ——運算子優先順序!由於=號的優先順序更高,所以i=1,2;這個語句相當於(i=1),2; ,如果要得到期望的2,我們應該這樣來寫i=(1,2);。下面的**可以驗證這個說法的(注意第3行是無意義**,但是可不是錯誤**哦!)
int i,j; i=1,2; 3,4; j=(1,2); printf("%d\n%d\n",i,j);
繼續看第乙份**裡的第20行,這是乙個for迴圈**。這裡的逗號,也是逗號操作符哦。其實for迴圈也是逗號操作符經常出現的地方哦。 for迴圈裡只能寫乙個表示式,而逗號表示式這個時候就可以讓你完成兩個甚至多個表示式的計算。比如「for(;b<10;++b,--c)」,+ +b和--c就會在每次迴圈中都被執行到。
第27行就無須多說了。也就是一普通的變數宣告語句,這裡的逗號也不是c++逗號操作符的。
總的來說,逗號操作符並不是乙個非常常用的操作符,它只在某些特定的上下文環境裡會有很好的效果,同時,在編碼中還要非常小心錯誤的輸入的逗號引發錯誤的問題。
比如逗號和括號就會引發一些潛在問題,如果在編碼的時候一疏忽就會產生一些難以追查的隱藏bug,只有遵守一些既定的編碼規範,養成良好嚴謹的編碼習慣,才有助於避免一些諸如此類的問題出現。看看下面的**:
int myadd(int i,int j,int k) int myadd(int i,int j) int main() }
由於在第15行,錯誤的新增了括號(在實際編碼中這樣的情況太常見了),結果導致整個的輸出全錯了!因為(2,3)這個c++逗號操作符表示式的返回值是3,所以15行相當於是myadd(3,4)了!
逗號操作符
逗號操作符 可以構成逗號表示式 逗號表示式用於將多個子表示式連線為乙個表示式 逗號表示式的值為最後乙個子表示式的值 逗號表示式的前n 1個子表達 先來看乙個例子 include include using namespace std void func int i intmain int i 0 i...
逗號操作符過載
逗號操作符語義 將多個子表示式連線為乙個表示式,整個表示式的值是最後乙個表示式的值。前 個表示式可以沒有返回值。從左到右計算每個子表示式的值。逗號操作的過載 使用全域性函式對逗號操作符進行過載。過載函式引數必須有乙個是類型別。過載函式返回值型別必須是引用。class operator const c...
39 逗號操作符的分析
注 部落格中內容主要來自 狄泰軟體學院 部落格僅當私人筆記使用。測試環境 ubuntu 10.10 gcc版本 9.2.0 一 逗號操作符 1 逗號操作符 可以構成逗號表示式 逗號表示式用於將多個子表示式連線為乙個表示式 逗號表示式的值為最後乙個子表示式的值 逗號表示式中的前n 1個子表示式可以沒有...