为什么这个C ++代码会编译? 它有什么作用?

我不小心删除了方法名称时遇到了这个问题。 代码来自

bool bRet = MethodName(pData, pOutFilename); 

 bool bRet = (pData, pOutFilename); 

但仍然编译? 这段代码有什么作用? 这是什么意思? 它似乎返回true,总是这样(即使pData为null)?

欢迎任何想法!

它是“逗号运算符”

计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回该值(和类型)。

你的表达式bool bRet = (pData, pOutFilename); 是一个有效的表达式,它等同于表达式bool bRet = pOutFilename;

bool bRet = (pData, pOutFilename); ,首先计算表达式pData ,然后计算第二个表达式pOutFilename ,然后将第二个表达式的值赋给bRet (这就是操作符从左到右的方式)。

阅读: 逗号运营商: ,

逗号运算符具有left-to-right associativity 。 用逗号分隔的两个表达式从左到右进行计算。 始终评估左操作数,并在评估右操作数之前完成所有副作用。

要了解括号( )在表达式中的重要性,请考虑下面的示例。 观察这个例子中的输出(我有C例子):

 int main () { int i = 10, b = 20, c= 30; i = b, c; // i = b printf("%i\n", i); i = (b, c); // i = c printf("%i\n", i); } 

输出:

 20 30 

要理解输出: 查看优先级表 ,优先级低于= 。 在表达式中,您使用括号覆盖优先级。

它是一个逗号运算符 。 如果你有这样的表达式:

 i = (a, b); 

b将存储到i

所以在你的情况下:

 bRet = pOutFilename; 

pOutFilename将存储到bRet