用伪代码:=是什么意思?


25

标题为“ 算法实现 ”的部分具有以下代码:

// Return RC low-pass filter output samples, given input samples,
 // time interval dt, and time constant RC
 function lowpass(real[0..n] x, real dt, real RC)
   var real[0..n] y
   var real α := dt / (RC + dt)
   y[0] := x[0]
   for i from 1 to n
       y[i] := α * x[i] + (1-α) * y[i-1]
   return y

:=是什么意思?


2
我得知这是从哲学和逻辑表示法,它定义为“:=定义为”所以X:= 1 x被定义为1
帕特里克休斯

3
当我在1990年修读AP计算机科学时,我们使用Pascal作为学习语言。我总是:=以“变得等于”来称呼。我实际上更喜欢这种方式===因为自然语言中的“ =”是比较运算符(或至少是对事实的陈述。)
TecBrat 2014年

Answers:


59

:=是使用单等号相等测试的语言的赋值运算符。这些语言中最著名的是Pascal。由于C的影响,大多数语言都将=分配给=并将==进行测试。受过这种样式训练的一些较旧的文本和作者使用:=进行伪代码。您有时还会看到箭头<-进行分配

从文章:

input: an array a of length n with array elements numbered 0 to n − 1

inc ← round(n/2)
while inc > 0 do:
    for i = inc .. n − 1 do:
        temp ← a[i]
        j ← i
        while j ≥ inc and a[j − inc] > temp do:
            a[j] ← a[j − inc]
            j ← j − inc
        a[j] ← temp
    inc ← round(inc / 2.2)

一些现代语言使用箭头进行赋值;最值得注意的是R,它将其用于全局分配,而将单个等于(=)用于局部分配。

从Sebesta的编程语言概念和KN King博士的课堂笔记中,我们了解到赋值标准可以追溯到比C或Pascal更远的地方。看起来在1958年设计Algol时,决定使用:=进行赋值。该委员会由美国和欧洲的代表组成。委员会中的一些德国人熟悉Konrad Zuse的Plankalkul语言(该语言在第二次世界大战期间起草,但直到1972年才发布,直到2005年才实施),并希望该分配遵循该语言提议的分配方法。b+c => a其中b + c分配给a。委员会将其更改为=:,理由是当时输入程序的方法称为按键,没有使用“>”。因此,他们在平等结肠上妥协。但是,熟悉FORTRAN的美国人(直到1990年才使用小写字母)希望该任务向左操作,因为FORTRAN就是这样做的。

因此,他们设法将其更改为:=,并以FORTRAN(是已知的已实现语言)的样式而不是Plankalkul(德国以外的一种几乎未知的语言,未实现)将赋值向左而不是向右操作。 。Algol 60强烈影响了所有主要的随后命令式语言,包括Pascal和C。因此,Pascal保留了ALGOL的赋值语法,并且都保留了赋权习惯。

ALGOL的设计易于阅读并且接近数学符号。这是未来20多年在期刊中编写算法的事实上(基本上是法律上的)标准。因此,从1960年到1980年左右接受教育的讲师和计算机科学家会熟悉这种表示法。

1964年发布的IBM 029 Keypunch允许使用>和<字符,从而促使它们包含在C中。


1
除了缺少分号和函数返回类型之外,此代码无论如何看起来都像PASCAL,MODULA或其他一些Wirth语言。
Ingo

7
大多数伪代码:=用于分配。具有数学背景的人也会喜欢这一点。
oenone

3
补充一下,它实际上在PL / SQL中仍然非常使用。
2011年

1
不知道为什么,但是向左箭头
指示

2
Pascal(以及“ Wirth语言”的其余部分)是从ALGOL那里得到的,而后者是从数学符号中得到的。
梅森惠勒2012年

18

只是一个快速而脚的音符。 伪代码是非常非正式的,因此“:=”仅表示您想要的含义。正如其他人所说,诸如Pascal之类的特定语言使用“:=”进行赋值,以避免与“ =”混淆,而其他语言出于相同的目的使用“ =”和“ ==”的组合。

就实际的伪代码而言,您可以使用“ =”,“ ==”,“等于”,“分配给”,“:=“,“有”,“接收”或任何使您的船浮起的东西只要您保持一致,并且用法和上下文在您的伪代码中就很清楚。


6

我猜想它是赋值(我认为它是Delphi中的赋值运算符),所以在y [0]:= x [0]中,您正在将x [0]的值赋给y [0]。

但是AFAIK没有标准伪代码之类的东西,因此从理论上讲它可以是:=)。


8
@loudsight:因为= 已经有了非常不同的含义:平等。使用已经对不同的东西已经有了很好理解的含义的运算符是非常愚蠢的。
约尔格W¯¯米塔格

1
@JörgW Mittag好吧,我想这取决于目标受众是谁。我想对于大多数开发人员(Java,C / C ++等)=意味着赋值。

5
@loudsight:编写第一个伪代码时,大多数开发人员甚至还没有出生。那时,大多数人都是数学背景很强的人,他们写下了:=自然而然的选择算法,因为在数学符号中,x := v“让xv”相对于x = v,意味着“ x等于v”,因此会引起混乱。
back2dos

8
如果有一个标准的伪代码,我们会看到很多伪伪代码。

2
@ back2dos等即使在今天使用=分配也是令人困惑的。我仍然记得很久以前,当我第一次学习编程时,看到它是多么令人困惑x = x + 1。一旦您学习了基本的中学数学,x = x + 1就看起来像不可能的矛盾杂语。接下来,我读了一本非常优秀的计算机科学书籍,供一般读者(我认为是这本书)用于<-作业。x <- x + 1更容易理解。
MarkJ 2012年

-1

在数学中,它通常具有相同的含义:赋值。


6
据我所知,数学上没有“分配”之类的东西。
Ingo

7
在数学中,:=通常表示“定义为”或“在定义上相等”。
oenone

3
@Ingo:“将表达式x的值的位模式写入名为y的存储位置”与编程语言中的赋值完全不同。您所描述的是执行赋值语句的可能实现。
back2dos

3
@Ingo:我不同意。更不用说在属性的情况下,分配会产生调用,并且很大一部分代码是在虚拟机或解释器中执行的,而不是直接在“当前体系结构”上执行,甚至是对变量的分配这一事实由于优化,不需要进行这种操作。除少数例外,应根据语言规范使用语言,而不应基于有关其实现的某些假设。关于变量赋值,您真正能说的就是,名为y的变量会反弹到表达式x的值。
back2dos

3
@Ingo:不,这不是胡说。x := 1; y := 2; if (x = 1) y := 3像编译一样y := 3是一个合理的优化(假设以后不使用x)。在3个分配中,有2个是通过静态分析实现的。您对作业的“定义”是一个笼统的声明,如果没有很多假设,该术语的定义就不必依赖于它,这简直就是不成立。
back2dos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.