ガイド:カンマオペレータはプログラム開発で非常によく使われるオペレータです.では、C++言語で良いオペレータはありますか?もしあるならば、またどのように正しくC++カンマオペレータを使うべきですか?ここでは、関連概念を詳しく紹介します.多くのC++newbieはこの問題を聞いて、みんなは+-*/に対して自然に認識して、その他の%!&|なども見慣れないとは思いませんが、カンマオペレータ?半分の人が何をしているのか分からないかもしれません.実際には、カンマオペレータをよく使用しますが、すべてのコードに表示されるカンマがカンマオペレータであるわけではありません.まず、クラスのサンプルコードから始めましょう.1. class mynum
2. {
3. public:
4. mynum(double ndb,...)
5. {
6. //init with arguments
7. }
8. };
9. class someclass
10. {
11. someclass():
12. num(3,4)
13. ,a(0)
14. ,b(0)
15. ,c(15)
16. {
17. int i,j;
18. i=1,2; //int x=1,2;
19. for(;b<10;++b,--c)
20. {
21. ++a;
22. }
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は2つのパラメータ3と4になります.例えば13行目の場合です.このような場合、コンパイラはエラーを報告せず、プログラムも実行できますが、mynumクラスのメンバー変数は、コンストラクション関数が入力する変数値の変化によってプログラムの実行結果が完全に一致しない可能性があります.この2つのカンマはカンマオペレータではありません.14,15,16行目のカンマも、カンマオペレータではありません.この3つのカンマは、関数を間隔を置いて構築するために使用されるメンバー変数の初期化リストにすぎません.18行目のint i,j;よく使われる変数宣言の文ですが、カンマはここでも間隔変数宣言の役割を果たしているだけで、カンマ演算子ではありません.19行目のカンマは、C++カンマオペレータを知らないと、間違いだと思ってしまうに違いありません!実はこれがカンマオペレータです.i=1,2を経てこの文の後、iの値はいくらですか?以前のカンマオペレータの定義によれば、i=2を簡単に導くことができるようです.しかし、この答えは間違っています!あなたは間違った答えを出す時、1つの重要な要素--演算子の優先度を無視しました!=番号の優先度が高いため、i=1,2;この文は(i=1)、2に相当します.所望の2を得るには、i=(1,2)と書くべきである.次のコードはこの説を検証することができます(3行目は無意味なコードですが、エラーコードではありませんよ!) int i,j; i=1,2; 3,4; j=(1,2); printf("%d%d",i,j); 最初のコードの20行目を見続けます.これはforループコードです.ここのカンマも、カンマオペレータですよ.実はforループもカンマオペレータがよく出てくる場所ですよ.forループには1つの式しか書けませんが、カンマ式はこのとき、2つ以上の式の計算を完了させることができます.例えば「for(;b<10;++b,--c)」は、++bおよび--cがサイクル毎に実行される.27行目は言うまでもありません.つまり、通常の変数宣言文で、ここのカンマもC++カンマオペレータではありません.総じて、カンマオペレータは非常に一般的なオペレータではありません.特定のコンテキスト環境でのみ効果的です.また、符号化では誤った入力のカンマに注意してエラーの問題を引き起こします.例えば、カンマやカッコは潜在的な問題を引き起こし、符号化を怠ると追跡しにくい隠れたバグが発生し、既定の符号化規範を遵守し、厳格な符号化習慣を身につけてこそ、このような問題の発生を避けるのに役立つ.次のコードを見てください:int myadd(int i,int j,int k){return i+j+k;}int myadd(int i,int j) { return i+j; } int main() { for(int x=0;x<9;++x) { printf("%d",myadd((2,3),4)); } } 15行目でかっこを誤って追加したため(実際の符号化ではこのような状況があまりにもよく見られる)、結果として出力全体が間違っていた!(2,3)このC++カンマオペレータ式の戻り値は3なので、15行はmyadd(3,4)に相当します!