【问题标题】:Why does the following code not produce a compilation error?为什么下面的代码不会产生编译错误?
【发布时间】:2011-12-29 11:51:24
【问题描述】:

我正在使用 VS2005 编译器,我希望以下代码会出现编译错误。

int a=1, b= 2, c=3;
a = (b,c);

赋值后的值为 3。根据我的理解,它应该给出编译错误。

我很乐意知道这背后是否有任何正当理由。

【问题讨论】:

  • 为什么这会是一个编译错误?除非你的意思是你在第二行末尾忘记的分号?
  • 首先,为什么你希望这是一个编译错误?
  • 发布更完整的示例会更有帮助,因为您的代码确实会产生编译错误 - 它缺少尾随分号并且您无法分配该范围内的值。以下是否反映了您的预期? int main() { int a=1, b= 2, c=3; a = (b,c); }
  • 据我了解,如果语句没有做任何事情或导致问题,那么可能是编译器应该给出错误。在这里,变量 b 根本没有被使用,任何阅读代码的人都会感到困惑。根据我的理解,它根本没有使用它应该给出错误。
  • @Vijay:编译器不会出错,因为代码是有效的。你也许可以让它发出警告;如果您指定-Wall-Wunused,GCC 肯定会对此发出警告(如果您愿意,也可以通过指定-Werror 将其设为错误)。

标签: c++ compiler-errors comma-operator


【解决方案1】:

您的代码中唯一的错误是您忘记了第二行末尾的分号,但我认为这是您撰写问题时的印刷错误,而不是您问题的实际主旨。

我看不出您显示的代码为什么会产生编译错误。它对我来说编译得很好,a 的值实际上是 3。

See for yourself:以下代码返回3:

int main()
{
    int a=1, b= 2, c=3;
    a = (b,c);

    return a;
}

诀窍是您使用comma operator,它计算第一个操作数,然后丢弃结果,然后计算第二个操作数并返回它的值。

但是,正如Charles Bailey 所指出的,您必须将问题中显示的代码包装在函数内,否则您将在任何编译器中出现编译错误。 C++ 不允许在函数之外使用赋值语句。

【讨论】:

    【解决方案2】:

    您在 C++ 中使用逗号运算符,它不常用。这工作如下

    <expression1>, <expression2>
    

    它计算 &lt;expression1&gt; 并丢弃结果,然后计算 &lt;expression2&gt; 并将返回的结果作为整个表达式的值。

    【讨论】:

    • 为什么我们需要这样的东西?只是好奇。
    • 它有时用于在 for 循环的头部和其他一些情况下执行多项操作。一般来说,大多数人甚至不知道它的存在,而 C++ 也可以不用。
    【解决方案3】:

    这段代码没有错误。为什么你认为应该有编译错误?这里只有一个comma operator,它计算所有参数,但返回最右边的参数:在本例中为 3。

    【讨论】:

      【解决方案4】:

      引用http://en.wikipedia.org/wiki/Comma_operator

      "在 C 和 C++ 编程语言中,逗号运算符(由记号 , 表示)是一个二元运算符,它计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回此值(和类型) . 逗号运算符在所有 C 运算符中具有最低优先级,并且充当序列点。”

      【讨论】:

        【解决方案5】:

        我刚刚在 VS2005 上对此进行了测试,我得到了预期的编译错误。

        Compiling...
        main.cpp
        d:\dev\work\comptest\main.cpp(2) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
        d:\dev\work\comptest\main.cpp(2) : error C2374: 'a' : redefinition; multiple initialization
                d:\dev\work\comptest\main.cpp(1) : see declaration of 'a'
        

        声明行很好,但正如预期的那样,赋值语句在函数之外无效。编译器似乎将其解释为尝试使用默认的 int 类型重新初始化 a,这两种类型都不合法。

        【讨论】:

        • 我认为这个答案没有抓住重点——这个问题清楚地表明,他们对它确实编译并且a 的值为 3 感到惊讶——我们可以合理地得出结论,他们粘贴了一个不完整的 sn-p?
        • @bacar:我坚持我的回答,发布的代码无法编译(因为它不应该,正如发帖人所期望的那样 - 即使他没有说他期待什么错误或为什么)。如果它确实为海报编译,那么他做错了什么。我已经用他的编译器测试了他的代码,所以我希望这能帮助他找到差异。
        猜你喜欢
        • 2012-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-09
        • 1970-01-01
        • 2021-08-18
        • 2017-07-09
        • 2023-03-22
        相关资源
        最近更新 更多