读书人

c++ 一个小疑义

发布时间: 2012-10-19 16:53:35 作者: rapoo

c++ 一个小疑问
#include<iostream>
#include<string>
template<typename T>
class stack
{
public:stack(unsigned int size=100);
~stack();
void push(T value);
T pop();
private:int size;
T *data;
int sp;


};
template <typename T>
stack<T>::stack(unsigned int size)
{ sp=0;
this->size=size;
data=new T[size];
}
template<typename T>
stack<T>::~stack()
{ delete []data;
}

template<typename T>
void stack<T>::push(T value)
{
if(sp==size)
{
std::cout<<"stack overflow"<<std::endl;
return;



}


data[sp++]=value;

}
template<typename T>
T stack<T>::pop()
{ if(sp==0)
{std::cout<<"stack empty"<<std::endl;
exit(0);}
else return data[--sp];
}





int main()
{ stack<std::string> stringstack(10);
stringstack.push("i am");
stringstack.push("chinese");
std::cout<<stringstack.pop()<<stringstack.pop();



return 0;}
大家看main() 函数里面 输出的那句 std::cout<<stringstack.pop()<<stringstack.pop();这样输出的是 i amChinese
没有倒着输出 ,不懂了 ??

如果我换成 std::cout<<stringstack.pop();std::Cout<<stringstack.pop();就可以 输出 chinese iam 为什么?

[解决办法]
http://topic.csdn.net/u/20110826/09/601ebe9c-c2ae-4d63-a4e2-506c618bb654.html?45918
顺序问题,在一条语句中执行顺序是随机的。
这种对顺序要求敏感的语句建议分开写。
[解决办法]
std::cout<<stringstack.pop()<<stringstack.pop();
附上这条语句的反汇编代码,自己看

00411608 lea eax,[ebp-138h]
0041160E push eax
0041160F lea ecx,[ebp-1Ch]
00411612 call stack<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >::pop (4110E1h)
00411617 mov dword ptr [ebp-158h],eax
0041161D mov ecx,dword ptr [ebp-158h]
00411623 mov dword ptr [ebp-15Ch],ecx
00411629 mov byte ptr [ebp-4],1
0041162D mov esi,esp
0041162F mov edx,dword ptr [ebp-15Ch]
00411635 push edx
00411636 lea eax,[ebp-110h]
0041163C push eax
0041163D lea ecx,[ebp-1Ch]
00411640 call stack<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >::pop (4110E1h)
00411645 mov dword ptr [ebp-160h],eax
0041164B mov ecx,dword ptr [ebp-160h]
00411651 mov dword ptr [ebp-164h],ecx
00411657 mov byte ptr [ebp-4],2
0041165B mov edi,esp
0041165D mov edx,dword ptr [ebp-164h]
00411663 push edx
00411664 mov eax,dword ptr [__imp_std::cout (41A378h)]
00411669 push eax
0041166A call dword ptr [__imp_std::operator<<<char,std::char_traits<char>,std::allocator<char> > (41A37Ch)]
00411670 add esp,8
00411673 cmp edi,esp
00411675 call @ILT+455(__RTC_CheckEsp) (4111CCh)
0041167A push eax
0041167B call dword ptr [__imp_std::operator<<<char,std::char_traits<char>,std::allocator<char> > (41A37Ch)]
00411681 add esp,8
00411684 cmp esi,esp
00411686 call @ILT+455(__RTC_CheckEsp) (4111CCh)
0041168B mov byte ptr [ebp-4],1


0041168F mov esi,esp
00411691 lea ecx,[ebp-110h]
00411697 call dword ptr [__imp_std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> > (41A358h)]
0041169D cmp esi,esp
0041169F call @ILT+455(__RTC_CheckEsp) (4111CCh)
004116A4 mov byte ptr [ebp-4],0
004116A8 mov esi,esp
004116AA lea ecx,[ebp-138h]
004116B0 call dword ptr [__imp_std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> > (41A358h)]
004116B6 cmp esi,esp
004116B8 call @ILT+455(__RTC_CheckEsp) (4111CCh)

读书人网 >C++

热点推荐