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

时间:2013-07-22 10:28:23

标签: c++ c syntax

我在意外删除方法名称时出现此问题。代码来自

bool bRet = MethodName(pData, pOutFilename);

bool bRet = (pData, pOutFilename);

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

欢迎任何想法!

3 个答案:

答案 0 :(得分:37)

"comma operator"

  

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

答案 1 :(得分:17)

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

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

阅读:Comma Operator: ,

  

逗号运算符,,。两个表达   用逗号分隔从左到右进行评估。左操作数是   总是评估,所有副作用都在右边完成   操作数被评估。

要了解括号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);
}

要了解输出:look at precedence table 20 30 的优先级低于,。在表达式中,您使用括号覆盖优先级。

答案 2 :(得分:4)

它是, comma operator。如果你有这样的表达式:

i = (a, b);        

b将存储到i

所以在你的情况下:

bRet = pOutFilename;

pOutFilename将存储到bRet