一、逗号操作符逗号操符( , )可以构成逗号表达式逗号表达式用于将多个子表达式连接为一个表达式逗号表达式的值为最后一个子表达式的值逗号表达式中的前 N-1 个子表达式可以没有返回值逗号表达式按照从左向右的顺序计算每个子表达式的值下面看一个逗号表达式的示例123456789101112131415161718192021222324252627282930#include iostreamusingnamespacestd;voidfunc(inti){cout func(): i i endl;}intmain(){inta[3][3] {(0, 1, 2),(3, 4, 5),(6, 7, 8)};inti 0;intj 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;return0;}输出结果如下注意三点1.使用括号就不是初始化的方式就变成了逗号表达式。要想其变成真正的初始化语句需要把圆括号改成花括号。即12345inta[3][3] {{0, 1, 2},{3, 4, 5},{6, 7, 8}};2.这个123while(i 5)func(i),i;等价于12345while(i 5){func(i);i;}3.(i, j) 6; 按照逗号表达式的规则就是等价于 j 6;二、重载逗号操作符在C 中重载逗号操作符是合法的使用全局函数对逗号操作符进行重载重载函数的参数必须有一个是类类型重载函数的返回值类型必须是引用下面来尝试一下重载逗号操作符1234567891011121314151617181920212223242526272829303132#include iostreamusingnamespacestd;classTest{intmValue;public:Test(inti){mValue i;}intvalue(){returnmValue;}};Test operator , (constTest a,constTest b){returnconst_castTest(b);}Test func(Test i){cout func(): i i.value() endl;returni;}intmain(){Test t0(0);Test t1(1);Test tt (func(t0), func(t1));cout tt.value() endl;return0;}输出结果如下其中1Test tt (func(t0), func(t1));等价于1Test tt (operator , (func(t0), func(t1)));问题的本质分析C 通过函数调用扩展操作符的功能进入函数体前必须完成所有参数的计算函数参数的计算次序是不定的重载后无法严格从左向右计算表达式可以看一下不重载会输出什么把下面这段注释掉。1234Test operator , (constTest a,constTest b){returnconst_castTest(b);}输出如下可以看到不重载逗号操作符是按照从左到右执行重载后反而不正常了所以逗号操作符没有重载的必要。注意事项工程中不要重载逗号操作符