【问题标题】:Why does this C++ code compile? What does it do? [duplicate]为什么这个 C++ 代码可以编译?它有什么作用? [复制]
【发布时间】:2013-07-22 10:28:23
【问题描述】:

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

bool bRet = MethodName(pData, pOutFilename);

bool bRet = (pData, pOutFilename);

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

欢迎提出任何想法!

【问题讨论】:

  • 检查逗号运算符。同pData; bool bRet=pOutFilename;

标签: c++ c syntax


【解决方案1】:

"comma operator"

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

【讨论】:

  • 对于“实用”用途,if (condition) return fprintf(stderr, "Debug message\n"), FALSE; 如果您想临时添加调试消息而不必添加大括号。
  • @RobertFisher 有趣..,也可以是i = DEBUG_VALUE, j;
  • 值得一提的是pOutFilename的值被隐式转换为bool。假设pOutFilename是一个指针,如果pOutFilename是一个空指针,则结果是false,否则是true
【解决方案2】:

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

bool bRet = (pData, pOutFilename);中,第一个表达式pData被求值,然后第二个表达式pOutFilename被求值,然后第二个表达式的值被赋值给bRet(这就是,运算符从左到右的工作方式-对)。

阅读:Comma Operator: ,

逗号运算符,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

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

【讨论】:

  • 除非pData 有副作用,我猜。
  • 只有当它是一个宏时才能拥有它
  • @StefanoFalasca 如果pData 未初始化,则可以将各种适用标准解释为意味着pData, pOutFilename 中的pData 有时是未定义的行为。如果pData 是一个包含信号 NaN 的浮点变量,也可能会发生一些事情,但我对此了解不多。
【解决方案3】:

它是, comma operator。如果你有这样的表达方式:

i = (a, b);        

b 将被存储到 i 中。

所以在你的情况下:

bRet = pOutFilename;

pOutFilename 将存储到bRet

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多