22

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

bool bRet = MethodName(pData, pOutFilename);

bool bRet = (pData, pOutFilename);

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

欢迎任何想法!

4

3 回答 3

37

它是“逗号运算符

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

于 2013-07-22T10:29:54.463 回答
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);
}

输出:

20
30

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

于 2013-07-22T10:29:26.917 回答
4

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

i = (a, b);        

b将存储到i.

所以在你的情况下:

bRet = pOutFilename;

pOutFilename 将存储到bRet.

于 2013-07-22T10:33:17.663 回答