编程语言评估策略

时间:2014-12-26 21:41:07

标签: programming-languages

请您解释一下按值分配,按引用打电话,按姓名打电话和按需拨打电话之间的区别和定义?

1 个答案:

答案 0 :(得分:0)

按值调用

  

按值调用评估是最常见的评估策略,在语言中使用与C和Scheme不同。在按值调用时,参数表达式被计算,结果值绑定到函数中的相应变量(通常通过将值复制到一个新的记忆区域)。如果函数或过程能够为其参数赋值,则只分配其本地副本 - 也就是说,当函数返回时,传入函数调用的任何内容在调用者的作用域中都不会改变。

按参考呼叫

  

在逐个参考评估(也称为按引用传递)中,函数接收对用作参数的变量的隐式引用,而不是而不是其价值的副本。这通常意味着该函数可以修改(即分配给)用作参数的变量 - 其调用者将看到的内容。因此,可以使用call-by-reference来提供额外的通道被调用函数和调用函数之间的通信。调用引用语言使程序员更难以跟踪函数调用的效果,并可能引入微妙的错误。

差异

按值示例调用

  

如果按值传递数据,则数据将从例如main()中使用的变量复制到函数使用的变量。因此,如果在函数内部修改了传递的数据(存储在函数变量中),则仅在函数内使用的变量中更改该值。我们来看一个按值示例的调用:

#include <stdio.h>

void call_by_value(int x) {
    printf("Inside call_by_value x = %d before adding 10.\n", x);
    x += 10;
    printf("Inside call_by_value x = %d after adding 10.\n", x);
}

int main() {
    int a=10;

    printf("a = %d before function call_by_value.\n", a);
    call_by_value(a);
    printf("a = %d after function call_by_value.\n", a);
    return 0;
}

按值代码示例的此调用的输出将如下所示:

a = 10 before function call_by_value.
Inside call_by_value x = 10 before adding 10.
Inside call_by_value x = 20 after adding 10.
a = 10 after function call_by_value.

通过参考示例

进行调用
  

如果数据通过引用传递,则复制指向数据的指针而不是实际变量,就像在按值调用中所做的那样。因为复制了指针,如果在该函数中更改了该指针地址的值,则该值也会在main()中更改。我们来看一个代码示例:

#include <stdio.h>

void call_by_reference(int *y) {
    printf("Inside call_by_reference y = %d before adding 10.\n", *y);
    (*y) += 10;
    printf("Inside call_by_reference y = %d after adding 10.\n", *y);
}

int main() {
    int b=10;

    printf("b = %d before function call_by_reference.\n", b);
    call_by_reference(&b);
    printf("b = %d after function call_by_reference.\n", b);

    return 0;
}

参考源代码示例的此调用输出如下所示:

b = 10 before function call_by_reference.
Inside call_by_reference y = 10 before adding 10.
Inside call_by_reference y = 20 after adding 10.
b = 20 after function call_by_reference.

何时使用

通过引用方法调用的一个优点是它使用指针,因此变量使用的内存不会加倍(与使用value方法调用的副本一样)。这当然很棒,降低内存占用总是一件好事。那么为什么我们不通过引用来调用所有参数呢?

有两个原因导致这不是一个好主意,并且您(程序员)需要在按值调用和按引用调用之间进行选择。原因是:副作用和隐私。不需要的副作用通常是由参考参数对呼叫进行无意中的更改引起的。此外,在大多数情况下,您希望数据是私有的,并且调用函数的人只有在您需要时才能更改。因此,默认情况下最好使用值调用,如果期望数据更改,则仅使用引用调用。

按名称呼叫

  

在逐个名字的评估中,函数的参数在调用函数之前评估 - 而是直接替换为函数体(使用捕获 - 避免替换),然后在它们出现在函数中时进行评估。

按需拨打

  

懒惰评估或按需调用是一种评估策略,它将表达式的评估延迟到需要它的值(非严格评估),并且还避免重复评估