为什么这个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
。