2013-02-04 58 views
-5
 #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()方法。在运算符< <重载,我们看到s.getTI的不同值,这很奇怪!为什么这个意外的变量发生变化?

+4

试着拿出一个最小的例子,可能是十几行。 –

回答

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

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

对单独的代码行进行s.getTI()s.pop()评估。

+0

是的,我已经尝试了单独的行,你是对的!但为什么这些操作数的评估顺序完全没有说明?是不是这样的语言无能? – user2038951

+0

@ user2038951:不,不是。语言不需要定义操作数评估的顺序。你可以在你想要的时候自己得到相同的结果,当你不在意(大多数情况下)时,你不会为特权支付额外的费用。 –

相关问题