to:"吴文智"
你是什么机器?这个问题我再Win2000 WinNT Win98上都遇到过
应该和机器无关

解决方案 »

  1.   

    在VB中,()表示取值,也就是说,test (intTest) 的运行过程是 
      dim j as  Integer
      j=intTest
      test j这里的j变量是由系统生成的,也就是说,你虽然用的是ByRef,但在这个函数调用中,改变的是一个零时由系统产生的变量,所以intTest本身并没有改变,所以就会出现上面的情况,所以要想学好编程一定要先打好基础,所以这道题你一定要给我分!!! ^_^
      

  2.   

    不是()的问题,以下的程序结果是 20            20            10 
    是否是因为函数的参数传递,实际上是参数地址的传递Private Sub Command2_Click()
        Dim intTest2 As Long
        Dim intTest1 As Long
        Dim intTest3 As Long
        intTest1 = 10
        intTest2 = 10
        intTest3 = 10
        test intTest1
        a = test(intTest2)
        test (intTest3)
        Debug.Print intTest1, intTest2, intTest3End SubFunction test(i As Long)  
     i = 20End Function
      

  3.   

    to:(uguess) and (老妖)在vb里面调用一个函数可以有下面三种方法
    func1 param1
    a = func1(param1)
    func1 (param1)假如func1使用ByRef方式传参数
    那么VB给我们的现象是
    func1 (param1)这种调用方式相当于ByVal方式传递
    前两种传递参数方式是我们希望的ByRef方式传递uguess似乎没有解决问题的根本,你说()表示取值,那么为什么a = func1(param1)仍然修改了param1?我现在对结果有了了解,但是为什么会这样,仍然不是狠明白
    希望大家探讨,谢谢
      

  4.   

    我想你们还没有看明白:1、gender(gender) 的第一段程序写的是
        test (intTest)
        MsgBox intTest2、yangzhaoyu(老妖) 的程序写的是
        a = test(intTest2)
        test (intTest3)
        Debug.Print intTest1, intTest2, intTest3这两种写法为什么会出现不同的结果呢?这是因为在 a = test(intTest2) 中的括号已不再是“取值”的做用了,就象“=”号,有时是赋值,有时是比较。
      

  5.   

    uguess(uguess):
    你的意思是说,test(intTest1)
    这句话包含的意思是把intTest1的值“取”出来,而不管test是按照什么方法传递参数
    也就是如果用test(intTest1)的方式调用的话,vb强制性使用ByVal的方法?
    而a = test(intTest2)和 test test3
    都是尊重test的传递参数方法?如果是这样,狠容易误导人啊
      

  6.   

    我的意思?
    不是我的意思,这是MS的意思!
    事实上,这就是VB的规则:就象我上面的例子,“=”号,有时是赋值,有时是比较,你能说这样“狠容易误导人”么?要知道在C里,这两种状态的符号是不一样的。可那又怎么样?那是C的规则阿,所以在VB中的规则是什么,你就得怎么用!
      

  7.   

    我也做了一遍,结果一个20,一个10。
    我把Function改成sub,结果就一致了。
    如果把test(inttest)改成call test(inttest),结果也会正确。
    对此我也感到很困惑。我认为这是VB的一个缺陷、或者说是一个未列入文档的功能。
    感谢gender给我们提出了这个问题,我觉得微软专家应该来看一看这个问题。
    在目前我认为如果使用函数而没有用到其返回值的情况下,应该使用CALL myfunction(arg1,arg2),避免使用myfunction (arg1,arg2)。
      

  8.   

    我的天!
    怎么有这么多奇怪的想法????
    to bucher(bucher) 这并不是什么“VB的一个缺陷、或者说是一个未列入文档的功能”,这就是VB的规则!!!
    在CALL myfunction(arg1,arg2)这种用法中,括号已不再是“取值”的做用了!
    我建议所有对此有疑问的人仔细学习学习VB的基础概念把!另外,把Function改成sub,那个例子也不会“结果就一致了”。
      

  9.   


    想这种括号作为取值运算的情况,只有在只有一个参数的情况下。大家可以试一试,把上面的函数改写成:
    Function test(ByRef i As Integer, ByRef k As Integer)
        i = 20
    End Function然后再写:
    Private Sub Command1_Click()
    Dim intTest As Integer
    Dim k As Integer
        intTest = 10
        k = 10
        test (intTest, k)   '注意这一句
        MsgBox intTestEnd Sub
    这时候大家就会看到又提示说“错误:缺少“=”号”
    为什么一个参数的时侯不会有这种错误呢?这就是因为在一个参数的时候括号是作为取值运算的!现在有很多的人都在用VB写程序,大家都说VB简单,如门快。对,这不错,但是有没有想过,仅仅用控件写个对话框,这并不是真正意义上的“懂VB”,要先打好基础!
      

  10.   

    感谢uguess耐心的解释,也感谢大家的讨论
    首先说我用vb大约有4年时间,项目做了不计其数,从来没有考虑过这个问题
    4年的编成时间,我先后使用了delphi、vb、java以及web开发的asp和jsp
    今天谈到的问题,是我的一个朋友问我的,如果他不问,我想,我一辈子也不会去认真考虑到底是怎么回事。这也许就是uguess说的“没有好好学习基础概念”。我想我今后会注意的 :)uguess的说明,我认为我是理解了,但是,这同时也说明,vb在构造自己的语言表现形式的时候
    还是欠思量,MS太注重简单,但是简单就会引起歧义,这是不可避免的。
    所以,该明确说明的地方,就应该从语法上明确限制。uguess肯定是一位有丰富经验的程序员
    你的理解,是通过你不断的实践中领悟的,现在我也基本上领悟了,希望大家也能够领悟。系统说我只能加20分,呵呵,只好都给uguess吧,谢谢uguess,也谢谢大家