【问题标题】:return list of values between parenthesis (10, 20, 30, 40)?返回括号(10、20、30、40)之间的值列表?
【发布时间】:2013-11-28 20:41:28
【问题描述】:

我在 Visual Studio 2012 中使用 C++(不是 C++/CLI)。

我不明白为什么这段代码可以工作,我原以为它会在编译时失败,但它甚至不会在运行时失败:

double MyClass::MyMethod() const
{
    //some code here        
    return (10, 20, 30, 40);
}

我错误地生成了这段代码,不是故意的,我在运行单元测试时注意到了这个错误。我很惊讶它有效。当我运行它时,它返回 40,列表中的最后一个数字。

谁能解释一下这个语法的含义以及它为什么起作用?

【问题讨论】:

  • 我很好奇应该有什么代码?函数调用?
  • @ShafikYaghmour,哈哈,是的!我有 C# 中的代码,我正在传递给 C++,似乎我在创建所有内容时错过了编写函数名,并且这些值不是那样的 const 整数,它们是变量,但对于这个问题,它们已经足够好了。 :) 感谢您的回答!

标签: c++ comma-operator


【解决方案1】:

这是使用comma operator,它将评估从从左到右的每个表达式,但只返回最后一个。如果我们查看draft C++ standard 部分5.18 逗号运算符,它会说:

一对用逗号分隔的表达式从左到右计算;左侧表达式是丢弃的值表达式(第 5 条)。83 与左侧表达式相关的每个值计算和副作用都在与右侧表达式相关的每个值计算和副作用之前排序。

链接的文章给出了最常见的用法:

在不使用块语句的情况下允许多个赋值语句,主要是在 for 循环的初始化和增量表达式中。

如果您真的很好奇,那么之前的帖子Uses of C comma operator 有一些非常有趣 的示例,说明人们如何使用逗号运算符

gcc 使用-Wall 时,启用警告始终是一个好主意可能对您有所帮助,我看到以下警告:

warning: left operand of comma operator has no effect [-Wunused-value]
  return (10, 20, 30, 40);
              ^

然后是另外两个。

【讨论】:

  • 非常有趣!当我看到该代码时,我没有意识到它使用的是逗号运算符(可能是因为在 C# 中这不起作用),我在互联网上搜索,当然我找不到任何人问与我相同的问题。这里还有一个与逗号运算符的使用及其优先级有关的有趣问题stackoverflow.com/questions/54142/… 我发现有趣的是,return 10, 20, 30, 40 也可以,但它会返回 10
  • 有趣的是,我启用了警告,但 Visual Studio 并没有在该行显示警告。
  • @Dzyann 好的,如果我使用/Wall,我会得到a warning,但如果你包含任何标题,它会生成大量不可用的警告,因此它是无用的。真是太傻了。
  • 是的,你是对的,我只启用了 W3 的异常(显然是 Visual Studio 的默认设置),我收到了超过 6k 的警告,大多数来自标准库中的文件。不是很有用。
  • /Wall 通常没有用,因为它确实启用了所有警告(在某些其他编译器上,/Wall 仅启用“有用”警告;对于 Visual C++,/W4 执行此操作)。您应该使用 /W4,然后启用您关心的特定警告。您可以使用 the /w option 启用个别警告,例如cl /W4 /w44548 将在警告级别 4 启用警告 4548(您正在寻找的那个)。
【解决方案2】:

逗号运算符是 C++ 中的“序列点”,通常用于初始化 for 循环中的多个变量。

因此,代码将一系列整数作为单个表达式一次一个地求值。其中最后一个是返回值,整个return语句就相当于简单的return (40);

【讨论】:

  • C++11 有done away 有序列点的想法。
  • @legends2k:但不是排序的想法,即使标准使用更冗长的方式来表达同样的事情,在线程中谈论“序列点”仍然是有意义的。
  • @MikeSeymour 同意,这只是对使用的术语进行吹毛求疵,并传播有关新术语的信息;从概念上讲它仍然存在。
【解决方案3】:

表达式(10, 20, 30, 40)实际上是由,分隔的4个表达式的串,你可以用,分隔多个表达式,结果是最后一个的求值。

【讨论】:

    【解决方案4】:

    您使用了,,即comma operator

    return () 有效。

    return (/*valid evaluation*/)也是如此

    Comma operator 返回最后一个值,即40

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-21
      • 2015-01-31
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多