请教关于引用的一个问题
小弟刚刚学习c++引用,写了下面个函数练习,不知为什么出了问题,真心请前辈指教。
#include<iostream>
using namespace std;
bool search(const int arr[], const int& size, const int& l, const int& target, int& pos)
{
for(int i = l; i < size; i++)
{
if(arr[i] == target)
{
pos = i;
return true;
}
}
return false;
};
int main()
{
int pos = 0;
int abcd[4] = {2, 3, 4, 5};
cout << search(abcd, 4, 0, 5, pos) << ", " << pos << endl;
return 1;
}
我认为输出应当是1, 4然而输出是1,0;也就是说pos没有被赋值,但是pos是以引用方式传递的呀,请前辈指教,谢谢。
[解决办法]
将
cout << search(abcd, 4, 0, 5, pos) << ", " << pos << endl;
改为
cout << search(abcd, 4, 0, 5, pos);
cout<< ", " << pos << endl;
[解决办法]
cout << search(abcd, 4, 0, 5, pos) << ", " << pos << endl;
从右向左演算顺序,即先算pos,那时它还是0
这就是经常讨论的“副作用”,导致代码“模糊”的例子。
[解决办法]
这是个副作用的问题,建议楼主不要这样写代码。
[解决办法]
cout << a << b;相当于
(cout.operator<<(a)).operator<<(b);相当于(this指针展开)
operator<<(operator(cout, a), b);
分析它的调用顺序,为了执行外部的operator<<,从右向左压参,先压的就是b,然后为了得到第一个参数,它执行内部的operator<<,从而先输出a,同时得到cout,压参,就能调用外部的operator<<,就输出b
结论就是这样的链式调用,参数演算顺序从右到左,输出顺序从左到右。