Programming languages 程序设计语言评估策略

Programming languages 程序设计语言评估策略,programming-languages,Programming Languages,请您解释一下按值调用、按引用调用、按名称调用和按需要调用之间的区别和定义好吗?按值调用 按值调用评估是最常见的评估策略,在C和Scheme等不同语言中使用。在“按值调用”中,对参数表达式进行求值,并将结果值绑定到函数中相应的变量(通常是通过将值复制到新的内存区域中)。如果函数或过程能够将值分配给其参数,则只分配其本地副本—也就是说,当函数返回时,传入函数调用的任何内容在调用方的作用域中都是不变的 参考电话 在按引用调用求值(也称为按引用传递)中,函数接收对用作参数的变量的隐式引用,而不是其值的副

请您解释一下按值调用、按引用调用、按名称调用和按需要调用之间的区别和定义好吗?

按值调用 按值调用评估是最常见的评估策略,在C和Scheme等不同语言中使用。在“按值调用”中,对参数表达式进行求值,并将结果值绑定到函数中相应的变量(通常是通过将值复制到新的内存区域中)。如果函数或过程能够将值分配给其参数,则只分配其本地副本—也就是说,当函数返回时,传入函数调用的任何内容在调用方的作用域中都是不变的

参考电话 在按引用调用求值(也称为按引用传递)中,函数接收对用作参数的变量的隐式引用,而不是其值的副本。这通常意味着函数可以修改(即分配给)用作参数的变量,调用者将看到一些东西。因此,通过引用调用可以在被调用函数和调用函数之间提供额外的通信通道。引用调用语言使程序员更难跟踪函数调用的效果,并且可能会引入一些微妙的错误

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

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

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

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

点名 在按名称调用求值中,函数的参数在调用函数之前不会求值,而是直接替换到函数体中(使用捕获避免替换),然后在函数中出现时留给求值

需要时打电话 延迟求值或按需调用是一种求值策略,它延迟表达式的求值,直到需要它的值为止(非严格求值),并避免重复求值


引用调用示例是假的:C没有引用调用。您演示的是使用指针,在C中,指针需要显式使用,并且它们的值是按值传递的。一个更好的例子是C++,它具有函数的参数的<代码>和/代码>类型修改器,或者PASCAL,其<代码> OUT/<代码>和<代码> var >代码>关键字,或者可以是C < >代码> OUT/<代码>和<代码> REF> /COD> > Python,其中每一个实例的实例都通过引用也可以是一个很好的例子。
#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.
#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.