1

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

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

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

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

4

5 回答 5

6

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

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

自己看:以下代码返回 3:

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

    return a;
}

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

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

于 2011-12-29T11:55:26.880 回答
5

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

<expression1>, <expression2>

它评估<expression1>并丢弃结果,然后评估<expression2>并将返回的结果作为整个表达式的值。

于 2011-12-29T11:55:02.657 回答
1

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

于 2011-12-29T11:54:51.420 回答
1

引用http://en.wikipedia.org/wiki/Comma_o​​perator

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

于 2011-12-29T11:56:15.663 回答
1

我刚刚在 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'

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

于 2011-12-29T11:58:22.530 回答