为什么以下代码不会产生编译错误?

时间:2011-12-29 11:51:24

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

我正在使用VS2005编译器,我希望以下代码能够提供编译错误。

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

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

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

5 个答案:

答案 0 :(得分:6)

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

我认为你所展示的代码没有理由产生编译错误。它编译对我来说很好,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 ++不允许在函数之外使用赋值语句。

答案 1 :(得分:5)

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

<expression1>, <expression2>

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

答案 2 :(得分:1)

这段代码没有错误。为什么你认为应该有编译错误?这里所有的都是comma operator,它会评估所有参数,但会返回最右边的参数:在这种情况下为3。

答案 3 :(得分:1)

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

  

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

答案 4 :(得分: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,这两种类型都不合法。