标量和原始数据类型——它们是一回事吗?

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

我对它们的理解是,它们是类似 int、 boolean、 char 等简单类型的数据类型。

我是不是忽略了什么,意味着你应该使用特定的术语,还是这些术语只是可以互换? 每个人的维基百科页面都没有显示任何明显的信息。

如果这些术语可以简单地互换,那么哪个更好呢?

71298 次浏览

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

标量 通常与 化合物进行对比,例如数组、映射、集合、结构等。标量是一个“单”值——整数、布尔值,也许是一个字符串——而一个化合物由多个标量组成(可能还引用了其他化合物)。“ Scalar”用于单值/简单值/原子值和复合值之间相关区别的上下文。

然而,基本类型 引用类型形成对比,当相关的区别是“这是直接的一个值,还是一个包含实际值的引用?”比如 Java 的基本类型与引用。我认为这是一个比标量/复合更低层次的区别,但并不完全是。

它实际上取决于上下文(以及讨论的语言家族通常是什么)。举一个可能是病态的例子: 字符串。在 c 中,字符串是一个复合体(字符数组) ,而在佩尔,字符串是一个标量。在 Java 中,字符串是一个对象(或引用类型)。在 Python 中,所有内容(概念上)都是对象/引用类型,包括字符串(和数字)。

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

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 + + 结构。Struct 可用于组合数据类型(如 int 和 char)以获得辅助数据类型。结构定义的数据类型始终是辅助数据类型。主数据类型不是从任何东西派生出来的,而是在编程语言中给定的。

我有一个类似原始的命名方法,意思是原始。这种并行就是“正则表达式”。我认为“常规”这个术语可以理解为“调节”。这样就有了一个调节搜索的表达式。

标量词源(http://www.etymonline.com/index.php?allowed_in_frame=0&search=scalar&searchmode=none)的意思是阶梯状。我认为这与编程有关的方式是,梯子只有一个维度: 从梯子的末端到底有多少级。标量数据类型只有一个维度,因此由单个值表示。

我认为在用法上,原始和标量是可以互换的。有没有不是标量的基元或不是标量的基元的例子?

虽然基元可以互换,但它指的是数据类型是其他数据类型的基本构造块,而基元不由其他数据类型组成。

Scalar 指的是它只有一个值。标量与数学向量形成对比。一个向量不是用一个单一的值来表示,因为(以一种向量为例)一个值需要表示向量的方向,另一个值需要表示向量的大小。

参考链接: Http://whatis.techtarget.com/definition/primitive Http://en.wikipedia.org/wiki/primitive_data_type

这些术语有很多混淆和误用。一个常常被用来表示另一个。以下是这些术语的实际含义。

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

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

“ Scalar” ——这是让大多数人感到困惑的一个——指的是可以表示比例(因此得名)的值,比如大小、体积、计数等等。整数、浮点数和分数都是标量。复数、布尔值和字符串都是 没有标量。原子的东西不一定是标量的,标量的东西不一定是原子的。标量可以是本机的,也可以由库提供。

有些类型的分类很奇怪。BigNumber 类型通常实现为一个数字或整数数组,它们是标量,但在技术上它们不是原子的。如果实现是隐藏的,并且您无法访问内部组件,那么它们可能看起来是原子的。但是组成部分只是隐藏的,所以原子性只是一种假象。它们几乎总是由图书馆提供,所以它们不是本地的,但它们可以是。例如,在 Mathematica 编程语言中,大数是原生的,因为 Mathematica 程序没有办法将它们分解成它们的构建块,所以在这种情况下,它们也是原子的,尽管事实上它们是在掩盖下的复合(在这里你不再是 Mathematica 语言的世界)。

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

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

Null 类型是唯一最符合“标量类型”定义的东西。即使把“无”序列化为“ N”,放入一个传统上标量的16位单词中——或者甚至是一个具有多个可能值的单位——也不是一个“单一数据”。

每个原语都是标量,但反之亦然。

成为 标量与语言没有任何关系,而成为 原始则完全依赖于语言。这两者之间没有任何关系。

标量数据类型具有一组有限的可能值,遵循一定的比例,也就是说,每个值都可以与任何其他值相等、大于或小于比较。数值(浮点数和整数)是显而易见的例子,而离散/枚举值也可以认为是标量。在这方面,布尔值是一个标量,有两个离散的可能值,通常情况下,true > false 是有意义的。无论编程语言如何,字符串在技术上都不是标量。

什么是 原始取决于语言。每种语言都对它的“基本类型”进行分类,这些类型被指定为它的基本类型。在 JavaScript 中,字符串是原始的,尽管它不是一般意义上的标量。但在某些语言中,字符串并不是原始的。要成为原语类型,该语言必须能够将其视为 永恒不变,因此,诸如对象、数组、集合等 参照物类型在大多数(如果不是全部的话)语言中不能成为原语类型。