为什么会发生这种意外的变量?

时间:2013-02-04 08:44:01

标签: c++ variables methods

        #include <iostream>
#include <fstream>
using namespace std;
const int maxsize=20;
class IntStack{
private:
    int element[maxsize],topindex;
public:
    IntStack(){topindex=-1;}
    int getTI(){
        return topindex;
    }
    int top(){
        if(topindex==-1)
            exit(-1);
        return element[topindex];
    }
    int top(int *t){
        if(topindex==-1)
            return -1;
        t=&element[topindex];
        return 0;
    }
    int pop(){
        if(topindex==-1)
            exit(-1);
        topindex--;
        return element[topindex+1];
    }
    int pop(int *t){
        if(topindex==-1)
            return -1;
        t=&element[topindex];
        topindex--;
        return 0;
    }
    int push(int e){
        if(topindex==19)
            return -1;
        topindex++;
        element[topindex]=e;
        return 0;
    }
    inline int empty(){return topindex==-1;}
    ostream& print(ostream& o){
        for(int i=0;i<=topindex;i++){
            o<<element[i]<<' ';
        }
        return o;
    }
};
ostream& operator <<(ostream& o,IntStack s){ ostream& operator <<(ostream& o,IntStack &s)
    cout<<s.getTI()<<endl; // prints 2
    while(s.empty()==0){
        o<<"index("<<s.getTI()<<")= "<<s.pop()<<endl; //getTI prints 1.
    }
    return o;
}
int main(){
    IntStack s;
    s.push(5);
    s.push(6);
    s.push(7);
    cout<<s; // the indexes should be 2, 1 , 0 but they are 1 0 -1!
    system("pause");
}

请编译这个,你只需要阅读getTI()和pop()方法。在运算符中&lt;&lt;重载,我们看到s.getTI的不同值,这很怪异!

1 个答案:

答案 0 :(得分:5)

o<<"index("<<s.getTI()<<")= "<<s.pop()<<endl; //getTI prints 1.

您假设在s.getTI()之前评估s.pop(),这不一定是真的。这些操作数的评估顺序是完全未指定的,事实上,我通常看到的模式大致是从右到左的评估。

对不同的代码行进行s.getTI()s.pop()评估。