这有什么不对?关联?评估顺序?如何改变秩序?

时间:2010-03-21 15:36:41

标签: c++

流插入运算符的关联性是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来改变顺序吗?

3 个答案:

答案 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;