首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++ 一个小疑义

2012-10-19 
c++ 一个小疑问#includeiostream#includestringtemplatetypename Tclass stack{public:stack(unsign

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) 

热点排行