读书人

为什么lv自加后输出还是原值

发布时间: 2012-06-08 12:55:24 作者: rapoo

求助:为什么lv自加后输出还是原值?
部分程序截取如下:

C/C++ code
#include <iostream>using namespace std;class Tpler      //写一个有关游戏玩家血、能量、升级等基本参数的类作练习{public:    Tpler(int hp=100,int ex=0,int pow=20,int atk=5,int def=8,int bomb=5,          int hmax=100,int pmax=50,int emax=20,int lv=1);    int Atk(int x);                 //攻击    int HPup(int food);        //加血    int HPdown(int hurt);      //减血    int EXup(int kil);             //加经验、升级    int Get_pow(int hit);        //加能量(气)    static int Get_lf(int x);        //加命    int Get_bmb(int x);             //加炸弹(大绝)    int Get_atk(int wpn);          //丢、捡武器,减少、增加攻击力    int Get_def(int equip); //丢、捡防具,减少、增加防御力    int Get_lv(){return lv;}    void PrintMax();      //输出各参数上限值private:    int hp,  ex,   pow,    hmax,  emax,  pmax,  atk,   def,    bomb,     lv;       //血、经验、能量(气)  血上限、经验上限 气上限  攻击力  防御力  炸弹(大绝)   级数    static int life;         //生命值所有玩家共用    static const int lmax,bmax,amax,dmax; //生命、炸弹、攻击力、防御力的最大值,不可变};int Tpler::EXup(int x)          //加经验,升级{    if(lv==10) return ex;     //级数最大为10,若已为10,则不操作直接返回ex值    else ex+=x;                  //经验值为原值加杀敌数。    if(ex>=emax)     //若ex新值达超原上限值,则升级,各项参数相应提升,ex为原值减去原上限值    {    hmax+=20;hp=hmax;        pmax=pmax*1.1+lv;        atk*=1.3;        def+=lv+1;        lv++;        if(lv==10)                //若升级后级数为10,则ex归零。            ex=0;        else        {    ex-=emax;            emax=emax*1.2+lv;        }    }    return ex;}void main()  //此主函数纯粹用来试验类的正确性{    Tpler p1,p2(120,23,52,6,10,3,120,62,26,2);    int food,hurt,hit,kil,wpn,eqp,skl1=2,skl2=3;//具体意思见类的函数声明    //skl对应某攻击技能,攻击力为普通攻击乘以倍数skl        p1.HPdown(hurt);        cout<<"input:food>>hurt>>hit>>kil>>wpn>>eqp"<<endl;    cin>>food>>hurt>>hit>>kil>>wpn>>eqp;    cout<<"p1:"<<"ex="<<p1.EXup(kil)<<",hp="<<p1.HPup(food)         <<",pow="<<p1.Get_pow(hit)<<",atk="<<p1.Get_atk(wpn)        <<",def="<<p1.Get_def(eqp)<<",bomb="<<p1.Get_bmb(1)        <<",life="<<Tpler::Get_lf(0)<<",lv="<<p1.Get_lv()<<endl;    p1.PrintMax();}

运行截图如下:

成员函数EXup执行lv++后,输出的lv还是原值?其它的数据成员++后则能正常输出,为什么?
完整程序请见2楼

[解决办法]
调了下你的代码。其实不是Lv没有++,而是作为cout的输出内容压栈的问题。你的Get_lv要先于EXup入栈。所以是输出了lv未加之前的值,
[解决办法]
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

[解决办法]
终于看明白了,
cout<<"p2:"<<"ex="<<p2.EXup(kil)<<",hp="<<p2.HPup(food)
<<",pow="<<p2.Get_pow(hit)<<",atk="<<p2.Get_atk(wpn)
<<",def="<<p2.Get_def(eqp)<<",bomb="<<p2.Get_bmb(0)
<<",life="<<Tpler::Get_lf(1)<<",lv="<<p2.Get_lv()<<endl;
简单的说对于cout,每个<<后面的参数是从右向左演算的,即先endl,再是p2.Get_lv()……最后是p2.EXup(kil),全部参数演算好了之后,从左向右依次输出,在这种情况下,++发生在get之后;要解决这种问题就不要写这种有副作用的代码,一个参数一个cout,即


cout << "p2:"
cout << "ex="
cout << p2.EXup(kil)
...

ostream & operator <<(ostream & os, const type & obj);
cout << a << b; ->
operator <<(operator <<(cout, a), b);

读书人网 >C++

热点推荐