В псевдокоде что означает: =?

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
Я узнал, что это было из философии и логической нотации, которая определяет его как «: = определено, чтобы быть», так что х: = 1 это х, определено как 1.
Патрик Хьюз
3
Когда я изучал компьютерную науку в 1990 году, мы использовали Паскаль в качестве языка обучения. Я всегда произносил :=как «становится равным». Я на самом деле предпочитаю это, =и ==так как "=" на естественном языке является оператором сравнения (или, по крайней мере, утверждением правды).
TecBrat

Ответы:

59

: = является оператором присваивания для языков, в которых используется проверка равенства на один знак равенства. Наиболее известным из этих языков является Паскаль. Из-за влияния Си большинство языков переключилось на = для назначения и == для тестирования. Некоторые старые тексты и авторы, которые были обучены таким стилям, используют: = для псевдокода. Вы иногда видите стрелки <- также для назначения .

Из статьи:

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 , который использует его для глобального присваивания, в то время как единственное равенство (=) для локального присваивания.

Из Концепций языков программирования Себесты и заметок класса доктора К.Н. Кинга мы узнаем, что стандарты заданий уходят гораздо дальше, чем С или Паскаль. Похоже, что в 1958 году, когда разрабатывался Algol, было решено использовать: = для назначения. Комитет состоял из представителей США и Европы. Некоторые из немцев в комитете были знакомы с языком Планрадкула Конрада Цузе (который был разработан во время Второй мировой войны, но не опубликован до 1972 года и не реализован до 2005 года) и хотел, чтобы задание следовало предложенному методу назначения этого языка, который былb+c => aгде b + c назначен a. Комитет изменил это на =: на том основании, что метод ввода программ в то время, называемый клавишным ударом, не имел «>» для использования. Таким образом, они пошли на компромисс на равных двоеточие. Тем не менее, американцы, знакомые с FORTRAN (до 1990 года у него не было строчных букв), хотели, чтобы назначение действовало влево, поскольку именно так FORTRAN делал это.

Таким образом, им удалось изменить его на: = и заставить назначение работать влево, а не вправо в стиле FORTRAN (являющийся известным реализованным языком), а не Plankalkul (практически неизвестный язык за пределами Германии и не реализованный). , Алгол 60 сильно повлиял на все основные последующие императивные языки, включая Паскаль и С. Таким образом, Паскаль сохранил синтаксис ALGOL для присваивания и сохранил левосторонность присваивания.

Алгол был разработан, чтобы быть легко читаемым и близким к математическим обозначениям. Это был де-факто (и в основном де-юре) стандарт для написания алгоритмов в журналах в течение следующих 20 с лишним лет. Таким образом, инструкторы и компьютерные ученые, получившие образование с 1960 по 1980 годы, были бы знакомы с этим стилем обозначений.

Выпуск IBM 029 Keypunch в 1964 году позволил использовать символы> и <, что побудило их включить их в C среди других.

Мировой инженер
источник
1
Помимо пропущенных точек с запятой и типа возврата функции, этот код в любом случае выглядит как PASCAL, MODULA или какой-либо другой язык вирт.
Инго
7
большинство псевдокодов используют :=для присвоения. люди с математическим прошлым тоже поддержат это.
Энон
3
Просто добавлю, что он все еще очень часто используется практически в PL / SQL.
Джалайн
1
не знаю почему, но левая стрелка в качестве задания просто сводит меня с ума 9
шабун
2
Паскаль (и остальные «языки вирта») получил его от ALGOL, который получил из математической записи.
Мейсон Уилер
18

Просто быстрая и педантичная нота. Псевдокод довольно неформальный, поэтому «: =» означает только то, что вы хотите, чтобы он значил. Как уже говорили другие, определенные языки, такие как Паскаль, используют «: =» для назначения, чтобы избежать путаницы с «=» для равенства, тогда как другие языки используют комбинацию «=» и «==» для той же цели.

Что касается фактического псевдокода , вы можете использовать «=», «==», «равно», «назначен», «: =», «имеет», «получает», или все, что плавает на вашей лодке, просто пока вы последовательны, а использование и контекст в вашем псевдокоде понятны.

S.Robins
источник
6

Я предполагаю, что это присваивание (я думаю, что это оператор присваивания в Delphi), поэтому в y [0]: = x [0] вы присваиваете значение x [0] для y [0].

Но в AFAIK нет такого понятия, как стандартный псевдокод , поэтому теоретически это может быть что угодно: =).

Кристоф Ванфлетерен
источник
8
@loudsight: Потому что = уже имеет совсем другое значение: равенство. Использование оператора, который уже имеет понятное значение для чего-то другого, было бы чрезвычайно глупо.
Йорг Миттаг
1
@ Jörg W Mittag Ну, я думаю, это зависит от того, кто является целевой аудиторией. Я хотел бы представить для большинства разработчиков (Java, C / C ++ и т. Д.) = Означает назначение.
5
@loudsight: Большинство разработчиков даже не родились, когда был написан первый псевдокод. Тогда, в основном, это были люди с сильным математическим образованием, которые записывали алгоритмы, что делает :=естественный выбор, потому что в математической нотации x := vозначает «пусть xбудет v», а не x = v« xравно v» и, следовательно, может вызвать путаницу.
back2dos
8
Если бы существовал стандартный псевдокод, мы бы увидели много псевдоподокода.
2
@ back2dos и т. д. Даже сегодня использование =для назначения сбивает с толку. Я до сих пор помню, как много лет назад, когда я впервые научился программировать, было странно видеть x = x + 1. После того, как вы изучили базовую математику в старшей школе, x = x + 1выглядело как невозможное противоречивое бред. Затем я прочитал отличную книгу по информатике для широкого читателя ( я думаю, что это было так ), которая использовалась <-для задания. x <- x + 1гораздо проще понять.
MarkJ
-1

Обычно это означает то же самое, что и в математике: назначение.

Йорг Миттаг
источник
6
Насколько я знаю, в математике не существует такого понятия, как «назначение».
Инго
7
в математике :=обычно означает «определяется как» или «равен по определению».
Энон
3
@Ingo: «записать битовый шаблон для значения выражения x в ячейку памяти с именем y» полностью отличается от назначения в языках программирования. То, что вы описываете, является возможной реализацией выполнения операторов присваивания.
back2dos
3
@ Инго: я не согласен. Не говоря уже о том факте, что в случае свойств присваивание приводит к вызову, и тот факт, что значительная часть кода выполняется в виртуальных машинах или интерпретаторах, а не непосредственно в «текущей архитектуре», даже присваивания переменных не нужно приводить к такой операции, из-за оптимизации. За некоторыми исключениями, язык должен использоваться в соответствии с его спецификациями, а не на основе некоторых предположений о его реализации. Все, что вы действительно можете сказать о присваиваниях переменным, это то, что переменная с именем y возвращается к значению выражения x.
back2dos
3
@ Инго: Нет, это не чепуха. Компиляция, x := 1; y := 2; if (x = 1) y := 3как если бы это было просто, y := 3является разумной оптимизацией (при условии, что x не используется позже). Из 3 заданий 2 выполнены с помощью статического анализа. Ваше «определение» назначений - это общее утверждение, которое просто не выполняется без многочисленных допущений, от которых не должно зависеть определение этого термина.
back2dos