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



我正在使用VS2005编译器,我期望以下代码给出编译错误。

int a=1, b= 2, c=3;
a = (b,c);
赋值后a的

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

我很想知道这背后是否有什么正当的理由。

您的代码中唯一的错误是您忘记了第二行末尾的分号,但我认为这是排版错误,而不是问题的实际要点。

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

自己看看:下面的代码返回3:

int main()
{
    int a=1, b= 2, c=3;
    a = (b,c);
    return a;
}
技巧在于使用了逗号操作符,它计算第一个操作数,然后丢弃结果,然后计算第二个操作数并返回其值。

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

您正在使用c++中的逗号操作符,它不常用。其工作方式如下

<expression1>, <expression2>

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

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

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

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

我刚刚在VS2005上测试了这个,我得到了预期的编译错误。

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

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

相关内容

  • 没有找到相关文章

最新更新