作者fumizuki (小狮子)
看板Visual_Basic
标题Re: [VB6 ] 计算机
时间Sat Jun 11 17:31:49 2005
※ 引述《TrueFeeling (昨日之死)》之铭言:
: ※ 引述《fumizuki (小狮子)》之铭言:
: : 数值是 0 1 2 3 4 5 6 7 8 9 ,不含其它符号,更不包含空格等等..
: : 有加减乘除的都称它为运算式
: 这我就不懂了,如果s只剩下数值的话,Eval应该不会再继续分割下去才对
你问:什麽叫做「执行完成」
我说:只剩下数值的时候
当然不会再继续分割下去呀@@...
: : Val() 并不是计算,是转换,它只取前几个字元,後面非数字的部份会舍弃。
: : 非数字的部份之後还就算还有数字,也照样舍弃...
: : 你最後一个的输出值抄错了吧...
: : 输出是 2,不可能是-13
: 现在我是的结果:
: 竟然又变成0了@@||
: 而且3种都是0
: 然後游标是一个"半形"的黑色长方体
: 怎麽会这样?!
▍像这样?
你按到 Insert 按键了...
...怎麽可能变成0...?
你式子一模一样吗
Val("2+3*7") = 2
没有可能会不对啊...
你是不是按到什麽了...
: : 第一个字元是2,第二个字元不是数字,所以之後的通通舍弃,只剩下2...
: : 没错,在这里 Eval 和 Val 的意思是相同的,
: : 不过 Val 会舍弃後方非数字的部份,Eval 不会做这个动作...
: : Eval 就是自订的函数,用来做四则运算用的...
: : 什麽?
: : 最高是说优先等级最高,会最先被处理的呀...
: 嗯嗯,我们理解的应该都一样,这应该只是表达的不同^^
: : 8个运算子的话...
: : 1+2+3+4+5+6+7+-8
: : 1: 1+2+3+4+5+6+7+-8
: : 2: 1
: : 3: 2+3+4+5+6+7+-8
: : 4: 2
: : 5: 3+4+5+6+7+-8
: : 6: 3
: : 7: 4+5+6+7+-8
: : 8: 4
: : 9: 5+6+7+-8
: : 10:5
: : 11:6+7+-8
: : 12:6
: : 13:7+-8
: : 14:7
: : 15:-8
: : 共15次
: : 等於说 Eval 执行的次数等於 运算元的数量 + 运算子的数量
: : 上面有 8 个运算元 (1,2,3,4,5,6,7,8),和 7 个运算子 (都是+号)
: : 8 + 7 = 15
: : (其中-8是负数,-8 视为一个运算元)
: 嗯嗯,这边我想错了
: : GoSub 和 Return 是互相配合的,有 Gosub 才有 Return
: : 没有 GoSub,使用 Return 是会发生错误的。
: : Return 当然是回到 GoSub 的地方呀
: 以这段程式为例:
: p = InStr(s, "+")
: If p > 0 Then GoSub SplitProc: Eval = Eval(op1) + Eval(op2): GoTo EndProc
: 你的意思是说,执行到GoSub SplitProc的时候
: 它会跳到
: SplitProc:
: op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return
: 然後SplitProc跑完又会回到GoSub SplitProc
: 然後在跳到
: SplitProc:
: op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return
: 就这样反覆循环,
: 然後最後才进入Eval = Eval(op1) + Eval(op2)然後GoTo EndProc吗?
: 如果是这样的话,
: 在GoSub Return的循环过程中
: Eval并没有被分割,没有被定义成Eval = Eval(op1) + Eval(op2)
: 它只在这一小段的程式中跳过去在跳回来,
: 没有跑到程式的其他部分,这样的话我无法理解
: 我一直以为是GoSub SplitProc以後,配合着
: SplitProc:
: op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return
: 有了op1 = Left(s, p - 1): op2 = Mid(s, p + 1)其中op1,op2的定义之後,
: 继续定义Eval = Eval(op1) + Eval(op2)得到新的Eval(即Eval(op1)和Eval(op2)),
: 然後再用新的Eval(即Eval(op1)和Eval(op2))重Function的一开始,
: 原原本本的再跑一次
不是这样的意思...
If p > 0 Then GoSub SplitProc: Eval = Eval(op1) + Eval(op2): GoTo EndProc
SplitProc:
op1 = Left(s, p - 1): op2 = Mid(s, p + 1): Return
的执行顺序是
GoSub SplitProc
op1 = Left(s, p - 1)
op2 = Mid(s, p + 1)
Return
Eval = Eval(op1) + Eval(op2)
GoTo EndProc
Return 是回到原地,但是并不是重覆再执行已执行过的东西,
那样子毫无意义,会变成无穷回圈...
--
VB 程式设计 仓木麻衣 PTT 星爷板 行列输入法
======================================================
Visual_Basic MaiKuraki Stephen Array
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.58.156.43
1F:→ LPH66:不是啦 黑框框那是输出错误的关系 61.62.178.179 06/11