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