【问题标题】:Output for pass-by-value and pass-by-name按值传递和按名称传递的输出
【发布时间】:2017-03-27 07:16:54
【问题描述】:

当 x 和 y 按值传递以及按名称传递时,我需要找到以下代码的结果。

PROGRAM EX1; 
int i; //global
int A[3]; //global

    PROCEDURE P1(int x, int y)
    Begin
        y:=2; 
        PRINT(x); 
        i:=3; 
        PRINT(x); 
        i:=3; 
        PRINT(x); 
        PRINT(y); 
    End; 
BEGIN //main
    A[1]:=7; A[2]:=13; A[3]:=11; 
    i:=1; 
    P1(A[i],i); //first call
    P1(i,A[i]); //second call
END.

如果 x 和 y 按值传递,我得出以下结论: 输出:13、11、11、3 第二个输出:1、3、3、11。 如果这是错误的,请帮助我理解原因。

从我看到的示例中,我也不确定在此代码中传递名称将如何工作。也请帮忙。

假设静态范围。

【问题讨论】:

  • 你试过google一下参数传递方法的含义吗?此外,您有时不能以一种方式将参数传递给函数/过程,有时以另一种方式。函数/过程声明确定了要使用的方法。最后,如果您按值传递,一旦过程/函数完成,对它们在过程/函数中的值所做的任何更改都会丢失。
  • 这只是理论上的,如果代码在运行时使用不同的参数传递会输出什么。是的,我已经用谷歌搜索并有一本关于不同传递方法的教科书,但我需要更多指导来帮助我理解。

标签: parameters parameter-passing generic-programming pass-by-value pass-by-name


【解决方案1】:

我将在描述过程中忽略您的代码很可能无法编译/运行这一事实,并且只会解决您的特定问题。

无论用于传递参数的机制(按值或按名称),对变量i 的赋值都是没有意义的:当按值传递时,根本没有任何意义(在函数P1 内)源参数可能是数组的事实;当按名称传递并且您传递A[i] 时,其中i=1 到达函数体P1A[1],因此更改为i 将没有任何效果。

因此,在这两种情况下(按值和按名称),您将得到相同的结果,这意味着:第一次调用为 7,7,7,2,第二次调用为 1,1,1,2。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2015-05-23
    • 2014-04-04
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    相关资源
    最近更新 更多