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

Dan*_*rch 22 c c++ syntax

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

bool bRet = MethodName(pData, pOutFilename);
Run Code Online (Sandbox Code Playgroud)

bool bRet = (pData, pOutFilename);
Run Code Online (Sandbox Code Playgroud)

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

欢迎任何想法!

Ste*_*sca 37

它是"逗号操作符",其

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

  • 对于"实际"用法,`if(condition)返回fprintf(stderr,"Debug message \n"),FALSE;`如果你想临时添加调试消息而不必添加大括号. (3认同)

Gri*_*han 17

您的表达式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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

20
30
Run Code Online (Sandbox Code Playgroud)

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

  • 我想,除非'pData`有副作用. (6认同)