给出以下代码;
#include<iostream>
using namespace std;
int main(){
int number_1 = 3;
int result_1 = 10;
result_1 += number_1;
cout << ++result_1;
cout << result_1 += number_1;
}
第cout << result_1 += number_1;
行给我一个错误。
'operator + ='不匹配(操作数类型为'std :: basic_ostream'和'int')
另一方面,cout << ++result_1;
正在运行,没有任何问题。
任何人都可以解释错误是什么,原因是什么?
答案 0 :(得分:5)
- 任何人都可以解释错误是什么,原因是什么?
醇>
根据Operator Precedence,operator<<
的优先级高于operator+=
,因此您的代码等同于:
(cout << result_1) += number_1;
虽然cout << result_1
将返回std::cout
(即std::ostream&
),然后尝试在operator+=
上调用std::ostream
并且它不存在。这是错误信息试图告诉你的内容。
您可以将其更改为:
cout << (result_1 += number_1) ;
或从根本上避免这种令人困惑的代码。
result_1 += number_1;
cout << result_1;
- 另一方面,
醇>cout << ++result_1;
正在运行,没有任何问题。
Beasuse operator++
的优先级高于operator<<
。所以它等同于cout << (++result_1);
并且没问题。
答案 1 :(得分:2)
如果您查看运算符优先级规则,您会发现该语句等同于
(cout << result_1) += number_1 ;
operator<<
会返回std::cout
。并且没有std::ostream::operator+=(int)
。
解决方案:使用括号表示预期的操作顺序。
另一方面,cout&lt;&lt; ++ result_1;没有任何问题
正如人们所料。研究运营商的优先级。
答案 2 :(得分:2)
运营商优先级。
该调用在语义上等同于cout << result_1; cout += result;
- 这是无效的。
在代码中添加括号(允许在+=
之前计算的<<
),如下所示允许代码编译;
cout << (result_1 += number_1);
关于错误本身;编译器无法为所提供的参数找到operator +=
的实现 - 它不是标准的实现。这是因为cout << result_1
在operator +=
之前进行了评估。从上面来看,这是有道理的,但并不能立即指出可以应用潜在修复的位置。
答案 3 :(得分:1)
仔细阅读commpiler错误。一切都在那里:)。
错误的原因是运算符优先。
编译器首先执行cout << result_1
。
然后,它尝试执行如下操作:cout += number_1
。
有任何意义吗?
要做你想要的改变你的行:
cout << (result_1 += number_1);
我强烈建议您阅读此内容: http://en.cppreference.com/w/cpp/language/operator_precedence