Скалярные и примитивные типы данных - это одно и то же? - PullRequest
105 голосов
/ 08 июля 2011

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

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

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

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

Ответы [ 6 ]

161 голосов
/ 08 июля 2011

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

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

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

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

12 голосов
/ 29 мая 2016

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

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

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

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

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

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

8 голосов
/ 16 декабря 2013

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

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

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

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

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

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

3 голосов
/ 15 апреля 2015

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

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

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

Скалярная этимология (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

0 голосов
/ 15 апреля 2019

Нулевой тип - единственное, что наиболее реалистично соответствует определению «скалярного типа».Даже сериализация «Нет» как «Н.»вписывание в 16-битное слово, которое традиционно является скалярным - или даже в один бит, имеющий несколько возможных значений - не является «единичными данными».

0 голосов
/ 18 июля 2016

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

...