求助:为什么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);