标量与原始数据类型-它们是同一件事吗?


127

在我读过的各种文章中,有时会引用原始数据类型,有时会引用标量。

我对每种数据的理解是它们是简单的数据类型,例如int,boolean,char等。

我是否缺少某些内容,这意味着您应该使用特定的术语,或者这些术语可以互换?每个维基百科页面上都没有明显的内容。

如果这些术语可以互换,那么哪个是首选?

Answers:


203

我认为它们不可互换。它们经常相似,但确实存在差异,并且似乎主要在于它们之间的对比以及上下文中的相关内容。

标量通常与化合物(例如数组,映射,集合,结构等)形成对比。标量是“单个”值-整数,布尔值,也许是字符串-而化合物由多个标量组成(并且可能是对标量的引用)其他化合物)。“标量”用于上下文之间的相关区分是单个/简单/原子值与复合值之间的情况。

但是,原始类型引用类型形成对比,并且在相关区别是“这是直接值还是包含真实值的对象的引用?”时使用,例如Java的原始类型与引用。 。我认为这是比标量/化合物低一些的区分,但不是完全一样。

它实际上取决于上下文(并且经常讨论什么语言族)。举一个可能是病态的例子:字符串。在C语言中,字符串是化合物(字符数组),而在Perl中,字符串是标量。在Java中,字符串是对象(或引用类型)。在Python中,一切(从概念上来说)都是对象/引用类型,包括字符串(和数字)。


1
在讨论引用类型和原始类型时也要考虑的是“值”类型。关于标量和基元的等效性,取决于语言。例如,根据PHP手册,仅其原始类型的一半是标量:php.net/manual/en/language.types.intro.php
Joe Bowbeer

11
8年后,这对我有所帮助:)
CoderXYZ '19

18

这些术语有很多混乱和误用。通常一个用来表示另一个。这些术语实际上是什么意思。

“本机”是指语言内置的类型,而不是由库(甚至是标准库)提供的,而不管它们是如何实现的。Perl字符串是Perl语言的一部分,因此它们是Perl中的本地语言。C使用库通过指向char的指针提供了字符串语义,因此,指向char的指针是本机的,而字符串不是。

“原子”是指不能再分解的类型。它与“ composite”相反。复合材料可以分解为原子值或其他复合材料的组合。本机整数和浮点数是原子的。分数,复数,容器/集合和字符串是复合的。

“标量”Scalar) -这是一个使大多数人感到困惑的值-表示可以表示标度的值(因此得名),例如大小,体积,计数等。整数,浮点数和分数是标量。复数,布尔值和字符串不是标量。原子的事物不一定是标量的,标量的事物不一定是原子的。标量可以是本地的,也可以由库提供。

一些类型具有奇数分类。通常以数字或整数数组形式实现的BigNumber类型是标量,但从技术上讲它们不是原子的。如果实现被隐藏并且您无法访问内部组件,则它们看起来可能是原子的。但是组件只是隐藏的,因此原子性只是一种幻想。它们几乎总是在库中提供的,因此它们不是本地的,但可以是。例如,在Mathematica编程语言中,大量数字是本机的,并且由于Mathematica程序无法将其分解为构建基块,因此在这种情况下它们也是原子的,尽管事实是它们是根据封面(您不再是Mathematica语言的世界)。

这些定义与所使用的语言无关。


16
尽管这种对标量类型的定义对我来说最有意义,但这似乎并不是最普遍接受的一种。
lleaff

1
感谢您对“标量”的明确定义。即使@lleaff指出大多数人没有以这种特定意义使用它,如果这样做的话会更好。
clockworkpc

出色的语言定义。应该将这个答案与Michael Ekstrand的答案一起阅读,以进行更全面的讨论。不幸的是,在编程语言的上下文中,标量具有不同的含义。
杰瑞

9

简而言之,似乎“标量”类型是指单个项目,而不是复合或集合。因此,标量既包含原始值,也包含枚举值之类的东西。

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

我很好奇这是否指的是这些项目是否具有“规模”的价值?-如数数。


2
(很久以前在学校里)有人告诉我,该术语源自“标量处理器”,与“矢量处理器”相反。标量处理器是一次只能处理一个数据的CPU。这些处理器以算术术语命名。有趣的是,当您在Wikipedia上查找“标量”时,您将被重定向到“变量”。
埃弗特

2

我喜欢Scott Langeberg的答案,因为它简洁明了,并有权威链接。如果可以的话,我会投票表决斯科特的答案。

我想可以将“原始”数据类型视为主要数据类型,以便从主要数据类型派生辅助数据类型。派生是通过合并,例如C ++结构。可以使用结构来组合数据类型(例如and和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

在C语言中,枚举类型,字符和整数的各种表示形式形成了一个更通用的类型类,称为标量类型。因此,您可以对任何标量类型的值执行的操作与对整数的操作相同。


0

空类型是最现实地符合“标量类型”定义的唯一内容。甚至将“无”序列化为“ N”。适合传统上为标量的16位字-甚至是具有多个可能值的单个位-都不是“单个数据”。

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.