Java/C#程序员常说他们的语言是按值传递引用,这意味着“引用”是一个对象指针,在调用函数时会被复制。
而在C++中(以及Perl和PHP的更动态形式中),引用是对其他名称或运行时值的别名。
我对这里的词源学很感兴趣。这个术语最早是如何使用的?让我们从Java之前开始看起,不过如果您知道C++之前的用法,那也会让我感兴趣。
(我知道词汇会发生变化等事实,但我只是对历史感兴趣。)
Java/C#程序员常说他们的语言是按值传递引用,这意味着“引用”是一个对象指针,在调用函数时会被复制。
而在C++中(以及Perl和PHP的更动态形式中),引用是对其他名称或运行时值的别名。
我对这里的词源学很感兴趣。这个术语最早是如何使用的?让我们从Java之前开始看起,不过如果您知道C++之前的用法,那也会让我感兴趣。
(我知道词汇会发生变化等事实,但我只是对历史感兴趣。)
Fortran 66是第一次尝试使用(我们现在称之为)按引用调用的语言进行规范。
这是仅有的第二次尝试指定支持参数传递的子程序的语言。
Fortran 66的“按名称关联”可以被视为Algol 60的“按名称调用”的受限(退化)形式。这种限制在于,在Fortran中,名称必须是一个简单的变量或数组名称,而在Algol 60中可以是任何表达式。
当时(1966年),并不清楚Algol 60的“按名称调用”注定要被放弃作为一个坏主意。事实上,当我在1977年作为本科生学习Algol 60时,我不记得讲师将“按名称调用”作为一个坏主意呈现出来。(它被呈现为难以理解...但那是另一回事。)
(此回复仅适用于C#,据我所知)
不要告诉Eric Lippert引用就是指针;-p在MS C# / .NET中它们恰好是相同的东西,但这是一种实现细节。引用是一种不透明、安全的“东西”,允许您定位对象。指针是一个内存地址。他们努力确保您始终知道自己的意思...
完全可以实现一个CLI和编译器,不将两者视为相同;尽管如此,您仍然会传递一个引用到该值。
我认为历史搜索应该使用"按引用调用"而不是"按引用传递"这个术语。例如,维基百科将 "Pass-by-reference" 重定向到 "Evaluation Strategy",其中列出了 call-by-reference。
在Google图书中使用“按引用方式调用”作为搜索词,可以找到来自《计算机杂志》1963年8月6:134-143(英国计算机学会)的“CPL的主要特点”的片段。我认为这个概念可以追溯到PASCAL,甚至更早。
最初的FORTRAN通过引用传递参数:即传递变量、数组或矩阵的地址。
ALGOL-60通过名称或值传递参数。按名称调用后来被证明是一个巨大的错误,它教会了编程语言设计者很多关于什么不应该做的事情。PASCAL根据参数是否标记VAR(按引用传递)来决定是按值还是按引用传递参数。
我想你可以追溯到 C,它有指针、引用和解引用运算符。
我一直以为的想法是区分指针和引用。 引用会指向对象所在的位置。
指针是指向内存中的地址,但在托管语言中,这可能会改变。 因此,您必须通过引用进行抽象,以确保您的代码始终正常工作。 例如,在托管语言中使用数组时,您不能只写reference ++,因为垃圾回收器可能会移动您的数组。 请注意,我非常了解C#中固定和不安全的代码:)。
正如我的Java导师所解释的那样,引用的另一个关键“概念”是您无法操作它。 指针用于程序员管理,引用用于编译器/运行时管理。
“引用”这个术语的使用一直不太一致。
int& r = i;
)的语言。其中一件事是,这意味着C++引用与C#引用非常不同。
我认为我们在这里缺少一些行话来区分这两种不同形式的“引用”。
2.12 引用
变量、数组元素或子字符串引用是在语句中出现变量、数组元素或子字符串名称,分别在上下文中需要使用该实体的值来执行可执行程序时。当执行对实体的引用时,其当前值可用。在此标准中,定义实体的行为不被视为对该实体的引用。
过程引用是在语句中出现过程名称,在上下文中需要执行过程指定的操作以在可执行程序执行期间执行。当执行过程引用时,必须可用该过程。