Я только сейчас узнаю о C.
Я нахожу странным, что создатели выбрали звездочку ( *
) в качестве символа для указателей, а не символ, который на самом деле выглядит как указатель ( ->
).
Учитывая, насколько запутанными могут быть разыменование и указатели на функции, есть ли историческая или даже практическая причина использования звездочки?
->
он используется на языке C в качестве оператора разыменования - при доступе к полям в struct:,struct_pointer->field
что сокращенно(*struct_pointer).field
.structs
разыменования, что показалось мне странным. Это символ указателя, верно? Почему не (<-
) для разыменования? Я действительно единственный, кто так думает?^
используется и может восприниматься как вращающаяся стрелка и читаться как «указывает на», то же самое значение,->
но короче.^integer
означает «указатель на целое число» для объявления типа иvar^
означает «памятьvar
указывает на» для разыменования. Положение символа более логично, чем C при чтении слева направо, которое всегда ставится после типа и перед именем переменной. Паскаль также использует@
для получения адреса, который лучше, чем&
, потому что@var
это «адрес, по которому находится var»Ответы:
Просто - потому что Б сделал.
Из развития языка Си
Это оно. На данный момент вопрос столь же неинтересен, как «почему Python 3 использует
.
для вызова метода? Почему нет->
?» Хорошо ... потому что Python 2 использует.
для вызова метода.Редко язык существует из ничего. Это имеет влияние и основано на чем-то, что было раньше.
Итак, почему B не использовал
!
разыменование указателя, как его предшественник BCPL?Ну, BCPL был немного многословным. Вместо
&&
или||
BCPL используетсяlogand
иlogor
. Это было связано с тем, что большинство клавиатур не имели∧
или∨
не были равны клавишам на самом делеNEQV
(см . Справочное руководство BCPL ).Кажется, что B был частично вдохновлен на ужесточение синтаксиса, а не на длинные слова для всех этих логических операторов, которые программисты делали довольно часто. И таким образом
!
для разыменования стало*
так, что!
можно было бы использовать для логического отрицания. Обратите внимание, что есть разница между унарным*
оператором и бинарным*
оператором (умножение).->
Было принято для синтаксического сахара вокруг поля derefrencesstruct_pointer->field
который(*struct_pointer).field
Другие варианты вроде
<-
могут создать неоднозначные парсинги. Например:Это должно быть прочитано как:
или
Создание унарного оператора, состоящего из бинарного оператора и другого унарного оператора, вполне может иметь проблемы, поскольку второй унарный оператор может быть префиксом для другого выражения.
Кроме того, снова важно постараться свести к минимуму количество набираемых вещей. Я бы не хотел писать:
Это также становится трудно читать.
Другие символы могли быть возможными (они
@
не использовались, пока Objective C не присвоил их ). Хотя опять же, это относится к сути «C использует,*
потому что B сделал». Почему B не использовал@
? Ну, Б не использовал всех персонажей. Не было никакойbpp
программы (сравните cpp ), и другие символы были доступны в B (например,#
которые позже использовались cpp).Если я могу рискнуть предположить, почему - это из-за того, где ключи. Из руководства по B :
Обратите внимание, что
&
это shift-7 и*
shift-8. Их близость друг к другу, возможно, была подсказкой программисту о том, что они делают ... но это только предположение. Можно было бы спросить Кена Томпсона о том, почему был сделан этот выбор.Итак, вот оно. С так, потому что Б было. В это так, потому что он хотел изменить то, как был BCPL.
источник
@
была бы другая возможность.&
и*
). Б тоже не пользовался,#
поэтому вокруг было еще несколько запчастей ... также$
.Я спросил студент , если
&
и*
были выбраны потому , что они были рядом друг с другом на клавиатуре (что - то я никогда раньше не замечал). Много гуглинга привело меня к документации B и BCPL и этой теме. Тем не менее, я не мог найти много вообще. Казалось, что*
в B было много причин , но я ничего не мог найти&
.Поэтому, следуя предложению @ MichaelT, я спросил Кена Томпсона:
источник