std::cout 语句评估顺序
std::cout statements evaluation order
pop() 函数有什么问题为什么不能正常工作?
class stack{
int *p, *Cursor;
int size ;
public:
stack(int sz) {Cursor = p = new int[size=sz+1];} //consider the stack empty when its size is 1
~stack() {delete[] p;} //Cursor and P will be destroyed when the program finishes
void push(int x) {Cursor+=1; *Cursor=x; size++;}
int pop() {if(Cursor == p) return -1; int temp = *Cursor; Cursor--; size--; return (temp);}
bool isEmpty(){return(Cursor == p);}
bool isFull(){return(Cursor == p+size);}
};
这是我的测试:
stack A(3);
std::cout<<"Empty: "<<A.isEmpty()<<std::endl;
std::cout<<"Full: "<<A.isFull()<<std::endl;
A.push(10);
A.push(20);
A.push(30);
std::cout<<std::endl;
std::cout<<" 1st pop: "<<A.pop()<<std::endl<<" 2nd pop: " <<A.pop()<<std::endl<<" 3rd pop: " <<A.pop()<<std::endl<<" 4th pop: " <<A.pop()<<std::endl;
我得到的输出是:
1st pop: -1
2nd pop: 10
3rd pop: 20
4th pop: 30
虽然我应该得到这样的东西:
1st pop: 30
2nd pop: 20
3rd pop: 10
4th pop: -1
问题是我哪里错了?
没有出错,但如果将 pop
全部放在一行 std::cout
中,则 pop
会(在您的情况下)从右到左进行评估。一般来说。评估顺序未指定。有关此的更多详细信息,请参阅 here。
所以你正确地以插入的相反顺序获取元素,然后 -1
然后反向打印它们。
在代码的最后一行,您进行了几个函数调用(隐藏,但每个 << 运算符实际上是一个函数调用)。这些函数调用的参数评估是未指定的。因此未指定首先调用哪个“pop() 函数。
pop() 函数有什么问题为什么不能正常工作?
class stack{
int *p, *Cursor;
int size ;
public:
stack(int sz) {Cursor = p = new int[size=sz+1];} //consider the stack empty when its size is 1
~stack() {delete[] p;} //Cursor and P will be destroyed when the program finishes
void push(int x) {Cursor+=1; *Cursor=x; size++;}
int pop() {if(Cursor == p) return -1; int temp = *Cursor; Cursor--; size--; return (temp);}
bool isEmpty(){return(Cursor == p);}
bool isFull(){return(Cursor == p+size);}
};
这是我的测试:
stack A(3);
std::cout<<"Empty: "<<A.isEmpty()<<std::endl;
std::cout<<"Full: "<<A.isFull()<<std::endl;
A.push(10);
A.push(20);
A.push(30);
std::cout<<std::endl;
std::cout<<" 1st pop: "<<A.pop()<<std::endl<<" 2nd pop: " <<A.pop()<<std::endl<<" 3rd pop: " <<A.pop()<<std::endl<<" 4th pop: " <<A.pop()<<std::endl;
我得到的输出是:
1st pop: -1
2nd pop: 10
3rd pop: 20
4th pop: 30
虽然我应该得到这样的东西:
1st pop: 30
2nd pop: 20
3rd pop: 10
4th pop: -1
问题是我哪里错了?
没有出错,但如果将 pop
全部放在一行 std::cout
中,则 pop
会(在您的情况下)从右到左进行评估。一般来说。评估顺序未指定。有关此的更多详细信息,请参阅 here。
所以你正确地以插入的相反顺序获取元素,然后 -1
然后反向打印它们。
在代码的最后一行,您进行了几个函数调用(隐藏,但每个 << 运算符实际上是一个函数调用)。这些函数调用的参数评估是未指定的。因此未指定首先调用哪个“pop() 函数。