为什么这段C++代码能编译?它的作用是什么?

22

当我无意中删除了方法名称时,我遇到了这个问题。代码从以下内容变为:

bool bRet = MethodName(pData, pOutFilename);

bool bRet = (pData, pOutFilename);

但仍已编译?这段代码是做什么用的?它表示什么意思?它似乎返回 true,这是否总是情况(即使 pData 为 null)?

欢迎任何想法!


7
检查逗号操作符,与 pData 一样;bool bRet = pOutFilename; - LS_ᴅᴇᴠ
3个回答

37

这是一个逗号运算符,它会执行第一个操作数并且忽略其结果,然后执行第二个操作数并返回该值(及其类型)。


3
为了实现一种“某种实用”的用途,可以使用以下代码:if (condition) return fprintf(stderr, "Debug message\n"), FALSE; 这样可以在不添加花括号的情况下临时添加一个调试信息。请注意,此处翻译保持原文意思的基础上尽可能通俗易懂,没有添加任何解释性内容。 - Robert Fisher
@RobertFisher 很有趣..,它也可以是 i = DEBUG_VALUE, j; - Grijesh Chauhan
值得一提的是,pOutFilename 的值被隐式转换为 bool。假设 pOutFilename 是一个指针,如果 pOutFilename 是空指针,则结果为 false,否则为 true - Keith Thompson

17

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

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

阅读:逗号运算符:,

逗号运算符,具有从左到右的结合性。用逗号分隔的两个表达式按从左到右的顺序进行评估。左操作数始终被评估,并且在评估右操作数之前完成所有副作用。

为了理解括号( )在您的表达式中的重要性,请考虑下面的示例。观察此示例中的输出(我有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
为了理解输出: 请查看优先级表 中的 , 优先级低于 =。在您的表达式中,您使用括号覆盖了优先级。

6
除非 pData 具有副作用,否则我猜不会发生这种情况。 - Joey
如果它是一个宏,它才有可能拥有这个。 - Stefano Falasca
如果pData未初始化,则有可能将各种适用的标准解释为在pData,pOutFilename中的pData有时是未定义行为。如果pData是包含信号NaN的浮点变量,则可能会发生一些事情,但我对此不太了解。 - Pascal Cuoq

4

这是一个, 逗号操作符。如果你有一个像这样的表达式:

i = (a, b);        
将被存储到中。因此,在您的情况下:
bRet = pOutFilename;

pOutFilename将被存储在bRet中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接