Скалярный и примитивный типы данных-это одно и то же?

в различных статьях, которые я читал, иногда есть ссылки на примитивные типы данных, а иногда есть ссылки на скаляры.

мое понимание каждого из них заключается в том, что они являются типами данных чего-то простого, как int, boolean, char и т. д.

есть ли что-то, чего мне не хватает, что означает, что вы должны использовать определенную терминологию или термины просто взаимозаменяемы? Страницы Википедии для каждого из них не показывают ничего очевидного.

Если термины просто взаимозаменяемы, какой из них предпочтительнее?

5 ответов


Я не думаю, что они взаимозаменяемы. Они часто похожи, но разница существует и, по-видимому, заключается главным образом в том, с чем они противопоставляются и что актуально в контексте.

скаляры обычно сравниваются с соединения, такие как массивы, карты, наборы, структуры и т. д. Скаляр-это "единственное" значение-целое число, логическое, возможно, строка, а соединение состоит из нескольких скаляров (и, возможно, ссылок на другие компонентов.) "Скалярный" используется в контекстах, где соответствующее различие между одиночными/простыми / атомарными значениями и составными значениями.

примитивные типы, однако, противопоставляются, например,ссылка типа, и используются, когда соответствующее различие " является ли это непосредственно значением, или это ссылка на что-то, что содержит реальную ценность?", как в примитивных типах Java против ссылок. Я рассматриваю это как несколько более низкое различие, чем скаляр / соединение, но не совсем.

Это действительно зависит от контекста (и часто обсуждается какая языковая семья). Возьмем один, возможно, патологический пример: струны. В C строка является составной (массив символов), в то время как в Perl строка является скалярной. В Java строка является объектом (или ссылочным типом). В Python все (концептуально) является типом объекта/ссылки, включая строки (и числа).


есть много путаницы и неправильного использования этих терминов. Часто одно означает другое. Вот что на самом деле означают эти термины.

"родные" относится к типам, встроенным в язык, а не предоставляемым библиотекой (даже стандартной библиотекой), независимо от того, как они реализованы. Строки Perl являются частью языка Perl, поэтому они являются родными в Perl. C предоставляет строковую семантику над указателями на символы с помощью библиотеки, поэтому указатель на char является родным, но строки-нет.

"атомной" относится к типу, который больше не может быть разложен. Это противоположность "композит". Композиты могут быть разложены на комбинации атомарных значений или других композитов. Собственные целые числа и числа с плавающей запятой являются атомарными. Дроби, комплексные числа, контейнеры/коллекции и строки являются составными.

"скаляр" -- и это тот, который смущает большинство людей -- относится к значениям, которые могут выражать масштаб (отсюда и название), таким как размер, Объем, Количество и т. д. Целые числа, числа с плавающей запятой и дроби являются скалярами. Комплексные числа, логические значения и строки являются не скаляры. Что-то атомарное не обязательно скалярно, а что-то скалярное не обязательно атомарно. Скаляры могут быть нативными или предоставляться библиотеками.

некоторые типы имеют нечетные классификаций. Типы BigNumber, обычно реализуемые в виде массива цифр или целые числа-это скаляры, но технически они не атомарны. Они могут показаться атомарными, если реализация скрыта, и вы не можете получить доступ к внутренним компонентам. Но компоненты только скрыты, поэтому атомарность-иллюзия. Они почти всегда предоставляются в библиотеках, поэтому они не являются родными, но они могут быть. Например, в языке программирования Mathematica большие числа являются родными и, поскольку программа Mathematica не может разложить их в своем здании блоки, они также атомарны в этом контексте, несмотря на то, что они являются композитами под обложками (где вы больше не находитесь в мире языка Mathematica).

эти определения не зависят от используемого языка.


проще говоря, похоже, что "скалярный" тип относится к одному элементу, а не к составному или коллекции. Таким образом, скаляры включают как примитивные значения, так и такие вещи, как значение перечисления.

http://ee.hawaii.edu / ~tep/EE160/Book/chap5/section2.1.3.html

возможно, "скалярный" термин может быть возвратом к C:

где скаляры являются примитивными объектами, которые содержат одно значение и не состоят из других C++ объекты

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1995/N0774.pdf

Мне интересно, относится ли это к тому, будут ли эти элементы иметь значение "масштаба"? - Например, считать числа.


Мне нравится ответ Скотта Лангеберга, потому что он лаконичен и подкреплен авторитетными ссылками. Я бы проголосовал за ответ Скотта, если бы мог.

Я полагаю, что "примитивный" тип данных можно считать первичным типом данных, чтобы вторичные типы данных производились от первичных типов данных. Вывод осуществляется путем объединения, например, структуры C++. Структура может использоваться для объединения типов данных (таких как и int и char) для получения вторичного типа данных. Структурно-определенный тип данных всегда вторичный тип данных. Первичные типы данных не являются производными ни от чего, скорее они даны в языке программирования.

У меня есть параллель с примитивом, являющимся номенклатурным значением primary. Эта параллель - "регулярное выражение". Я думаю, что номенклатуру " регулярная "можно понимать как"регулирующую". Таким образом, у вас есть выражение, которое регулирует поиска.

скаляр этимология (http://www.etymonline.com/index.php?allowed_in_frame=0&search=scalar&searchmode=none) означает лестничный. Я думаю, что это относится к программированию, так как лестница имеет только одно измерение: сколько ступеней от конца лестницы. Скалярный тип данных имеет только одно измерение, поэтому представлен одним значением.

Я думаю, что в использовании примитивные и скалярные взаимозаменяемы. Есть ли пример примитива, который не является скалярным, или скалярного, который не является примитивно?

несмотря на взаимозаменяемость, примитив относится к типу данных, являющемуся базовым строительным блоком других типов данных, а примитив не состоит из других типов данных.

скаляр означает, что он имеет одно значение. Скаляр контрастирует с математическим вектором. Вектор не представлен одним значением, потому что (используя один вид вектора в качестве примера) одно значение необходимо для представления направления вектора, а другое значение необходимо для представления величина вектора.

ссылки: http://whatis.techtarget.com/definition/primitive http://en.wikipedia.org/wiki/Primitive_data_type


в C типы перечислений, символы и различные представления целых чисел образуют более общий класс типов, называемый скалярными типами. Следовательно, операции, которые вы можете выполнять со значениями любого скалярного типа, такие же, как и для целых чисел.