当我无意中删除了方法名称时,我遇到了这个问题。代码从以下内容变为:
bool bRet = MethodName(pData, pOutFilename);
到
bool bRet = (pData, pOutFilename);
但仍已编译?这段代码是做什么用的?它表示什么意思?它似乎返回 true,这是否总是情况(即使 pData 为 null)?
欢迎任何想法!
这是一个逗号运算符,它会执行第一个操作数并且忽略其结果,然后执行第二个操作数并返回该值(及其类型)。
if (condition) return fprintf(stderr, "Debug message\n"), FALSE;
这样可以在不添加花括号的情况下临时添加一个调试信息。请注意,此处翻译保持原文意思的基础上尽可能通俗易懂,没有添加任何解释性内容。 - Robert Fisheri = DEBUG_VALUE, j;
。 - Grijesh ChauhanpOutFilename
的值被隐式转换为 bool
。假设 pOutFilename
是一个指针,如果 pOutFilename
是空指针,则结果为 false
,否则为 true
。 - Keith Thompson你的表达式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
为了理解输出: 请查看优先级表 中的 ,
优先级低于 =
。在您的表达式中,您使用括号覆盖了优先级。pData
具有副作用,否则我猜不会发生这种情况。 - JoeypData
未初始化,则有可能将各种适用的标准解释为在pData,pOutFilename
中的pData
有时是未定义行为。如果pData
是包含信号NaN的浮点变量,则可能会发生一些事情,但我对此不太了解。 - Pascal Cuoq这是一个,
逗号操作符。如果你有一个像这样的表达式:
i = (a, b);
将被存储到中。因此,在您的情况下:bRet = pOutFilename;
pOutFilename
将被存储在bRet
中。
pData
一样;bool bRet = pOutFilename;
- LS_ᴅᴇᴠ