在我读过的各种文章中,有时会引用原始数据类型,有时还会引用标量。
我对每一个的理解是,它们是简单的数据类型,如 int、boolean、char 等。
我是否遗漏了一些东西,这意味着您应该使用特定的术语,或者这些术语是否可以互换?每个人的维基百科页面都没有显示任何明显的内容。
如果这些术语可以简单地互换,那么哪个是首选?
在我读过的各种文章中,有时会引用原始数据类型,有时还会引用标量。
我对每一个的理解是,它们是简单的数据类型,如 int、boolean、char 等。
我是否遗漏了一些东西,这意味着您应该使用特定的术语,或者这些术语是否可以互换?每个人的维基百科页面都没有显示任何明显的内容。
如果这些术语可以简单地互换,那么哪个是首选?
我不认为它们可以互换。它们通常相似,但确实存在差异,并且似乎主要在于它们的对比和上下文相关的内容。
标量通常与复合物形成对比,例如数组、映射、集合、结构等。标量是“单个”值 - 整数、布尔值,可能是字符串 - 而复合物由多个标量组成(并且可能引用其他化合物)。“标量”用于相关区别在于单个/简单/原子值和复合值之间的上下文。
然而,原始类型与例如引用类型形成对比,并且在相关区别是“这是直接一个值,还是对包含真实值的某物的引用?”时使用,如在 Java 的原始类型与引用中. 我认为这是比标量/复合更低级别的区别,但不完全是。
这实际上取决于上下文(以及经常讨论的语言家族)。举一个可能是病态的例子:字符串。在 C 中,字符串是复合(字符数组),而在 Perl 中,字符串是标量。在 Java 中,字符串是一个对象(或引用类型)。在 Python 中,一切(概念上)都是对象/引用类型,包括字符串(和数字)。
这些术语有很多混淆和误用。通常一个用来表示另一个。以下是这些术语的实际含义。
“本机”是指内置于语言中的类型,而不是由库(甚至是标准库)提供的类型,无论它们是如何实现的。Perl 字符串是 Perl 语言的一部分,因此它们在 Perl 中是原生的。C 使用库在指向 char 的指针上提供字符串语义,因此指向 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
我很好奇这是否是指这些项目是否具有“规模”的价值?- 比如数数。
我喜欢 Scott Langeberg 的回答,因为它简洁且有权威链接支持。如果可以的话,我会投票赞成斯科特的回答。
我认为可以将“原始”数据类型视为主要数据类型,以便辅助数据类型派生自主要数据类型。派生是通过组合来实现的,例如 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
在 C 中,枚举类型、字符和整数的各种表示形式形成了一个更通用的类型类,称为标量类型。因此,您可以对任何标量类型的值执行的操作与对整数的操作相同。
null 类型是唯一最符合“标量类型”定义的东西。甚至将“None”序列化为“N”。适合传统上是标量的 16 位字 - 甚至是具有多个可能值的单个位 - 不是“单个数据”。
每个原语都是标量的,但反之则不然。DateTime 是标量,但不是原始的。
标量与语言无关,而原始则完全取决于语言。两者没有任何关系。
A scalar data type is something that has a finite set of possible values, following some scale, i.e. each value can be compared to any other value as either equal, greater or less. Numeric values (floating point and integer) are the obvious examples, while discrete/enumerated values can also be considered scalar. In this regard, boolean is a scalar with 2 discrete possible values, and normally it makes sense that true > false. Strings, regardless of programming language, are technically not scalars.
Now what is primitive depends on the language. Every language classifies what its "basic types" are, and these are designated as its primitives. In JavaScript, string is primitive, despite it not being a scalar in the general sense. But in some languages a string is not primitive. To be a primitive type, the language must be able to treat it as immutable, and for this reason referential types such as objects, arrays, collections, cannot be primitive in most, if not all, languages.