选择题 7.  某人编写了下面的程序
    Private Sub Command1_Click()
      Dim a As Integer,b As Integer
      a=InputBox("请输入整数")
      b=InputBox("请输入整数")
      pro a
      pro b
      Call pro(a+b)
    End Sub
    Private Sub pro(n As Integer)
      While(n>0)
          Print n Mod 10;
          n=n\10
      Wend
      Print
    End Sub
    此程序功能是:输入2个正整数,反序输出这2个数的每—位数字,再反序输出这2个数之和的每—位数字。例如:若输入123和234,则应该输出:
    3 2 1
    4 3 2
    7 5 3
    但调试时发现只输出了前2行(即2个数的反序),而未输出第3行(即2个数之和的反序),程序需要修改。下面的修改方案中正确的是______。
【正确答案】 A
【答案解析】 参数的传递
    形参名前面缺省修饰词,或有“ByRef”关键字时,则指定它是一个按地址传递的参数。按地址传递参数时,形参和实参共用内存的“同一”地址,即共享同一个存储单元,形参值在过程中一旦被改变,相应的实参值也跟着改变。
   按值传递参数(ByVal),传递的只是实参变量的副本。当采用按值传递时,过程对参数的任何改变实际上都是对栈中值的改变,仅在过程内部有效,而不影响实参变量本身。换句话说,一旦过程运行结束,控制返回调用程序时,对应的实参变量保持调用前的值不变。
本题中,过程Sub pro(n As Integer)的形参变量n按地址传递参数。程序执行pro a、pro b、Call pro(a+b)语句的过程如下:
   pro a
   n        Print n Mod 10    n=n\10
   123            3             12
   12             2             1
   1              1             0    程序结束时形参n的值变为0,则实参a的值也变为0。
   pro b
   n        Print n Mod 10    n=n\10
   234            4             23
   23             3             2
   2              2             0    程序结束时形参n的值变为0,则实参b的值也变为0
   Call pro(a+b)此时表达式a+b的值为0,过程pro()没有执行循环,所以不会反序输出变量a+b之和753。
要想输出变量a+b的实际输入的值的和,则变量a和b在过程的运行期间必须保持不变,因此形参必须采用传值的方式,故选项A正确。