基本数据类型是什么意思?


42

我对原始数据类型的理解是

它是语言隐式提供的数据类型(其他是用户定义的类)

因此,不同的语言具有不同的数据类型集,这些数据类型被认为是该特定语言的原始数据类型。那正确吗?

“基本数据类型”和“内置数据类型”之间有什么区别?维基百科说原始数据类型是这两者之一。

PS-为什么在SNOBOL4中而不是Java中将“字符串”类型视为原始类型?

Answers:


34

这取决于语言。

例如,在像C和C ++语言,你有一些内置的标量类型- ,intfloatdoublechar等等,这些都是在这个意义上的“原始”,他们不能被分解成简单的组件。从这些基本类型中,您可以定义新类型-指针类型,数组类型,结构类型,联合类型等。

然后,您有一种像老式Lisp这样的语言,其中的所有内容都是原子列表。同样,根据上述定义,原子是“原始的”,因为它不能分解为更简单的事物。

编辑

就我而言,术语“原始”,“基本”和“内置”几乎可以互换。但是,如果您想真正学究,则可以区分“内置”类型(由语言定义明确提供的类型)和从仍为“原始”或“基本”内置类型派生的类型因为它们不能分解成更简单的元素。C的typedef工具允许您为现有类型创建新的类型名称。Ada允许您创建对它们具有约束的新标量类型。例如,您可以从内置的浮点型派生一个“纬度”类型,但要限制它不能采用[-90.0,90.0]范围之外的值。它仍然是原始或基本类型,无法将其分解为任何更简单的组件,但是由于它是用户定义的,因此不被视为“内置”类型。

同样,这些概念有点模糊,它实际上取决于上下文。例如,“内置”类型的概念对于像BLISS这样的无类型语言毫无意义。


基本数据类型和内置数据类型之间有什么区别?
jsp99 2012年

1
“ string”是Java中的原始数据类型吗?(我已经看到了delnan对Jesper的回答的评论)。我想知道您的意见,因为在您的评论之一中,您说“原始类型是否取决于您询问的人”。
jsp99 2012年

@Appy-参见编辑。
John Bode 2012年

3
Java中的@Appy String不是原始的,因为它是复合类型。如果查看String类源代码(JDK文件夹中的src.zip),您会看到,内部String表示为字符数组。因此,您可以将String分解为单个字符。您不能将字符分解为较小的值,从而形成char基本类型和String复合类型。
Jacek Prucia 2012年

2
@Appy您错过了重点。SNOBOL4字符串无法分解。Java字符串可以。那就是区别。两者都是内置的,但是只有SNOBOL4字符串是原始的。
钻机2012年

19

Java角度来看:

在Java中,原始类型和非原始类型之间有非常明显的区别。

基本类型的变量直接包含该类型的值(换句话说,它们是值类型)。

非基本类型的变量不直接包含该值。相反,它是对对象的引用(类似于指针)。(在Java中无法创建用户定义的值类型)。

Java有八种原始类型:byteshortintlongcharbooleanfloatdouble。其他都是非原始类型。


因此,String数据类型在Java中不是原始的。在每个Java main()程序中,我们都编写“ public static void main(String args [])”。为什么?为什么我们总是必须在main中传递String参数?同样,我们也不需要像在C / C ++中那样将Java中的String类型导入(例如,#include <string>或使用std :: string)。请解释。
Maxood 2012年

7
@Maxood 在语言中String 确实具有特殊的地位(它获取文字,它在的签名中main,我认为JLS明确允许进行实习,可以自动使用等),但是它不是原始数据类型。可能有人称它为内置

@Jesper为什么原始类型可以更快地使用?仅仅是因为事实,他们没有多余的包装非原语吗?我试图弄清楚原语和非原语之间的区别...就像是将原语内置到CPU还是其他东西中?
阿卜杜勒

来自维基百科:“根据语言及其实现,原始数据类型可能与计算机内存中的对象一一对应,也可能不一一对应。但是,人们通常希望对基本原始数据类型的操作是最快的语言。有建筑。” ---因此,这种1对1的对应关系是它更快的根本原因,而对于对象,它不是1对1的关系。我对么?
阿卜杜勒

1
@Abdul不要太复杂。CPU具有许多寄存器,这些寄存器可以包含不同种类的原始值(例如32位或64位整数或单精度或双精度浮点数),并且CPU具有以硬件实现的指令以对寄存器中的值。您的最后一句话基本上是正确的。
杰斯珀

9

原语是一种基本数据类型,并非由其他数据类型构建而成。它只能代表一个单一值。所有原语必定是内置数据类型(编译器必须了解它们),但并非所有内置数据类型都是原语。

在某些语言中,编译器具有某些其他类型的内建知识,因为它必须能够以特殊方式对其进行处理。例如,Delphi和Visual Basic中的Variant(以及Boo的等同物“ Duck”)和大多数OO语言中的基础对象类。


谢谢:)您的回答非常有帮助,但是我听不清楚。您可以举出一些示例(可能使用C / C ++ / Java)。
jsp99 2012年

@Mason Wheeler这是我们使用松散打字和强打字的术语。正如我听到的人们所说的那样,VB是一种宽松类型的语言,而Java是一种强类型的语言。请确认。
Maxood 2012年

3
@Appy C ++附带有字符串,向量和映射的类。这些是内置的,它们随语言一起提供,在语言定义中等。但是它们是用C ++编写的,它们来自标准库。您可以编写自己的行为相同的代码。将此与int或char进行比较。您不能在C ++中定义自己的字符。您可以重载类中的每个运算符,并获得类似但不相同的行为。这是原始的。基本上是用某种语言定义的内容,无法用该语言实现。
stonemetal 2012年

5

为什么在SNOBOL4中而不是Java中将“字符串”类型视为原始类型?

因为Java语言规范非常清楚地指定了Java上下文中“原始”一词的含义,而Java的String语言不符合该规范,而SNOBOL4语言规范定义了SNOBOL4和SNOBOL4字符串中“原始”的含义符合该规范。

真的没有更多了。相应语言的规范定义了某些单词的含义,以及符合该描述或不符合的描述。例如,《 C语言规范》将“功能”一词的含义定义为某种东西,这显然不是 “功能”一词通常的含义,而是在C社区内部使用该词的方式。


@Mittag根据您的回答,我用了一些短语在Google上搜索,并遇到了一个非常不错的链接,该链接几乎消除了对该特定主题的所有疑问:)。
jsp99 2012年

0

“原始”数据类型意味着您在内存中存储了一个值-该值没有方法或内部结构。基元只能通过外部操作来操作。

在Java中,原语是数字(int,long等)和char。http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

如果您的值具有结构(我在这里考虑支撑),那么它不是原始的。如果它具有方法(对象或类),则它不是基元。


2
C#的原始int数据类型确实具有方法...
Heinzi 2012年

你能举个例子吗?
JoshRagem 2012年

var myString = 3.ToString();(请参阅Int32.ToString())。需要注意的是int在C#是一个同义词Int32,即,Int32 一种最原始的(不像Java中,其中Integer是从不同int)。因此,3.ToString()在C#中涉及拳击!
海因兹

很有意思;您提供的链接表明'int'确实是'Int32'类的对象(或者可能是基元和包装器类的组合),因此根据我的定义,'int'不是基元。:)
JoshRagem 2012年

1
@barlop:Java 不是 C ++的后代。如果赫伯特·希尔德(Herbert Schildt)甚至连事实都这么简单,我也不确定我是否会相信本书的其余部分。Java的原始设计师Patrick Naughton是Objective-C的忠实粉丝。实际上,当Scott McNealy说服他留在Sun并设计一种新语言时,他已经通知NeXT在Objective-C上工作。另一位原始设计师James Gosling对Smalltalk(Objective-C的直接祖先)和Lisp(Smalltalk的灵感)非常熟悉。后来,Objective-C设计团队的几位成员移至Sun。
约尔格W¯¯米塔格

0

我遇到了一些信息,并认为这将有助于其他答案。所以想分享-

维基百科说-

在计算机科学中,原始数据类型是以下之一:

基本类型是由编程语言提供的数据类型,作为基本构件。大多数语言允许从基本类型开始递归构造更复杂的复合类型。
内置类型是编程语言为其提供内置支持的数据类型。

在大多数编程语言中,所有基本数据类型都是内置的。此外,许多语言还提供了一组复合数据类型(Java中的“字符串”类型)。

我想这样说-
基本的数据类型是无法进一步细分的数据类型(“字符串”类型可以由“ char”组成,但是char不能“分解”为任何数据类型(在大多数编程中语言),因此是基本数据类型)

在SNOBOL4中,字符串类型被认为是原始类型。尽管我不知道为什么。它既基本又内置于SNOBOL4中。

Java规范清楚地提到了它认为是原始类型的数据类型列表。因为字符串类型不在其规范中,所以它不是Java中的原始数据类型,尽管它是内置类型。


-2

基元是语言本身提供的基本数据类型。C语言的示例是int,float,char数据类型。它作为语言的基本部分提供。

非基元是用户定义的变量或对象。例如,您可以定义一个存储数据的对象,或者可以在C语言中使用struct定义自己的变量。这些不是原始的,因为您必须先定义它们才能使用它们。

示例:员工,学生,a_very_large_number_that_you_defined_yourself

编辑更多说明并解决注释, 我认为原语是语言本身附带的变量,而不是C ++中像String这样的变量,您必须使用New关键字进行声明。这使其成为一个对象,因此String不会是原始类型。

回答您的评论:它可能与变量的实现有关。如果它是语言核心的一部分,那么它就是原始的。如果不是,则不是。示例是C ++中的String。这不是核心变量,而是使用New关键字声明的。所以它不是原始的。


感谢您的回答 。将数据类型分类为“原始”是否取决于实现?像在C / C ++中一样,我们将字符串存储为char数组,但是我们需要显式定义它们。因此,如果其他某种语言具有相同的实现来存储字符串但暗中提供了该实现,则数据类型“ string”是否将是该特定语言中的原始类型?
jsp99 2012年

@Appy-可能。C没有提供这样的string数据类型。字符串表示为原始类型的集合char。C ++引入了适当的string数据类型,但是它本身是否是“原始”类型取决于您询问的人。就个人而言,我不会将其归类。但是,由于某种原因,我可能会将老式BASIC字符串类型归类为原始类型。
约翰·博德2012年

在问题本身中解决了您的评论。请参阅编辑。
Noname 2012年

2
C ++中的字符串不需要使用new
jk

@jk我与C ++脱节。你是对的。将解决ans。
Noname 2012年

-2

为了更好地理解基本类型和用户定义的数据类型的概念,其他答案都缺少的概念compiler

如果您了解将词素选择为标记的概念,您将了解到,基元是编译器本身唯一知道的数据类型。

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.