流插入运算符的关联性是rtl,忘记这个事实有时会导致运行时或逻辑错误。 例如:
第一 -
int F()
{
static int internal_counter c=0;
return ++c;
}
在主要功能中:
//....here is main()
cout<<”1st=”<<F()<<”,2nd=”<<F()<<”,3rd=”<<F();
,输出为:
1st=3,2nd=2,3rd=1
这与我们初看起来的不同。
2阶 假设我们有一个像这样的堆栈数据结构的实现:
//
//... a Stack<DataType> class ……
//
Stack<int> st(10);
for(int i=1;i<11;i++)
st.push(i);
cout<<st.pop()<<endl<<st.pop()<<endl<<st.pop()<<endl<<st.pop()<<endl;
预期输出类似于:
10
9
8
7
但我们有:
7
8
9
10
没有&lt;&lt;的内部错误实施,但它可能是如此令人困惑...... 最后[:-)]我的问题:有没有办法通过重载来改变运算符的关联性?
你认为这可能不会逆转吗?我的意思是可以通过修改或更改开源STL来改变顺序吗?答案 0 :(得分:10)
不,没有。但我认为您可能会将评估顺序与关联性混为一谈。指定评估订单的唯一运营商是&amp;&amp;,||和,(逗号)。当你说:
cout<<st.pop()<<endl<<st.pop()<<endl<<st.pop()<<endl<<st.pop()<<endl;
编译器可以按照自己喜欢的顺序计算st.pop()等子表达式,这是导致意外输出的原因。
答案 1 :(得分:5)
唯一正确关联的东西是赋值运算符。见标准的§5.4至5.18。 <<
运算符从左到右进行计算,或者消息在语法上是向后的,而不是在内容中。内容是由于副作用,在C ++中无序,除了(如Neil提到的)“短路”&amp;&amp; amp;和||,逗号。
答案 2 :(得分:2)
要了解这是评估问题的顺序而不是关联问题,请将代码修改为:
int a = st.pop();
int b = st.pop();
int c = st.pop();
cout << a << endl << b << endl << c << endl;