发新话题
打印

从一个程序错误想到得

从一个程序错误想到得

本来是一个很简单的程序,但是弄了一个下午。
源代码如下:
#include<iostream>
using namespace std;
class Counter{
  int unsigned value;
    public :
  Counter(void)
  {value=0;
  cout<<"Countruct called!"<<endl;//显示调用了本构造函数的信息
  }
  void increment(void)
  {if(value<4294967295)value++;}
  void decrement(void)
  {if(value>0)value--;}
  int unsigned readValue(void)
  {return value;}
  ~Counter(void)
  {cout<<"destuct called!"<<endl;}//显示调用了本析构函数的信息
};
void main(void)
{int i;
Counter c1,c2;
for(i=0;i<6;i++)
{c1.increment();
cout<<"value of c1="<<c1.readValue()<<endl;
c2.increment();
}
cout<<"after loop,value of c2="<<c2.readValue()<<endl;
for(i=1;1<=5;i++)//这里可能大家很容易看出来,1<=5;永远正确,循环没有结束条件,但是在编译器里很隐蔽哦!
c2.decrement();
cout<<"final value of c1="<<c1.readValue()<<", value of c2="<<c2.readValue()<<endl;}



大家看哈执行后的结果(编译得时候当然能通过,因为没有语法错误),如下:
Countruct called!
Countruct called!
value of c1=1
value of c1=2
value of c1=3
value of c1=4
value of c1=5
value of c1=6
after loop,value of c2=6
-

(上面显示程序一直在运行!!!并且cout<<"final value of c1="<<c1.readValue()<<", value of c2="<<c2.readValue()<<endl;}没有执行,为什么?因为循环一直进行,也就是for(i=1;1<=5;i++)为真,当然一直执行c2.decrement();)
程序没有结束,析构函数当然不能被调用啊!


改正后的运行结果:
Countruct called!
Countruct called!
value of c1=1
value of c1=2
value of c1=3
value of c1=4
value of c1=5
value of c1=6
after loop,value of c2=6
final value of c1=6, value of c2=1
destuct called!
destuct called!
Press any key to continue
看到了吧!程序正常结束,析构函数被调用了!
呵呵!所以大家要细心啊!有些病毒就是这样隐藏自己的。比如有个病毒就是把自己的进程名设置为iexp1ore.exe,是iexp”1“ore.exe,数字1啊!!!无巧不成书啊,我给自己写了个“病毒”!

[ 本帖最后由 tanglinkun 于 2008-5-12 23:39 编辑 ]

TOP

把I写成1,我也遇到过,不过没你幸运,你只用了一个下午就解决了问题,而我却整整用了8天时间,查了很多资料,最后却又是不经意间发现,真不知是幸运还是不幸。

TOP

很久没接触编程了,来看看论坛,看看大家!希望大家经常来实验室实验,或者来看看!

TOP

发新话题