在整数a、b已经被定义的前提下,a = (b++,a*2)是合法的C++代码,其中的逗号是一个操作符。在作者看来,C++中的逗号操作符是一项非常反直觉并且容易导致错误的语法特性,建议读者非必要不使用。

版权声明

本文可以在互联网上自由转载,但必须:注明出处(作者:海洋饼干叔叔)并包含指向本页面的链接。

本文不可以以纸质出版为目的进行改编、摘抄。

一个逗号操作符的语法形式通常表现为:

1
expr1, expr2

这是一个表达式,以中间的逗号为分隔,左边为子表达式1,右边为子表达式2。当逗号操作符被应用时,C/C++会分别评估/计算子表达式expr1和expr2的值,然后再将expr2的值作为整个表达式的值。

1
a = (3+1,2);

在上述代码中,(3+1,2)是一个用括号括起来的包含逗号操作符的表达式。其中,3+1是左表达式,2是右表达式,最终,右表达式的值2会作为整个表达式的值被赋值给变量a。

我们通过下述示例进一步解释:

1
2
3
4
5
6
7
8
9
10
//Project - CommaOperator
#include <iostream>
using namespace std;

int main() {
int a = 3, b=7;
a = (b++,a*2);
cout << "a = " << a << ", b = " << b;
return 0;
}

上述代码的执行结果为:

1
a = 6, b = 8

第7行:(b++,a2)为一个用括号括起来的包含逗号操作符的表达式,其左表达式b++被计算/评估,b值从7变为8;其右表达式a\2也被计算/评估,由于a值为3,所以右表达式a*2的值为6,右表达式的值6最终被作为整个表达式的值赋值给变量a,变量a得值6。

注意:由于括号的参与,表达式“b++,a*2”先被计算,得到表达式结果后,再将表达式的值赋值给a。

从执行结果容易看出,a为6,b为8,与前述分析相符。