我正在使用 VS2005 编译器,我希望下面的代码会给出编译错误。
int a=1, b= 2, c=3;
a = (b,c);
赋值后的值为3。根据我的理解,它应该给出编译错误。
我很高兴知道这背后是否有任何正当理由。
我正在使用 VS2005 编译器,我希望下面的代码会给出编译错误。
int a=1, b= 2, c=3;
a = (b,c);
赋值后的值为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:\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
,这两者都不合法。