C 有原始类型的概念吗,如果有,它们是什么?

Does C have a concept of primitive types and if so what are they?

提问人: 提问时间:2/4/2023 最后编辑:jennifer k. 更新时间:2/12/2023 访问量:333

问:

例如,Java 有 8 种基元类型,如 Oracle 所记录的那样。

布尔值、字节、短、char、int、long、float、double

C 似乎有很多很多类型,但如果有任何被认为是原始类型的话呢?请列出它们作为答案。

我试图找到一个类似于 Oracle 但适用于 C 的可靠参考,但无法找到。

维基百科维护着一个“主要类型”的钝器列表,但我不确定它们是否相关。

W3Schools 简化了这一点并列出了“基本类型”,但我也不确定这是否相关。

爪哇岛 c 基元类型

评论

3赞 Steve Summit 2/4/2023
我本来想说,“C 有一个很好的、像 Java 一样的小基本类型列表”,但仔细想想,维基百科上的那篇文章虽然很复杂,但看起来相当准确。请注意,在实践中,许多类型基本上是彼此的同义词。例如,在绝大多数传统机器上,会发现类型与类型或相同,而类型与 或 相同。intint16_tint32_tunsigned intuint16_tuint32_t
2赞 user3386109 2/4/2023
你留下的是一个不完整的类型列表。
3赞 2/4/2023
如果我们删除,我们有 - - 作为主要类型,可以进一步细分为更多类型。有趣的是,Java 的 8 种类型包含了所有这 6 种类型,但添加了 ... .char, short, int, long, float, doubleboolean and byte
1赞 Eugene Sh. 2/4/2023
我很好奇,这个名字有什么区别?为什么使用“主要”、“基本”或“原始”词很重要?
1赞 user3386109 2/4/2023
C 在 C99 中添加了一个布尔类型。而 Java 的字节类型相当于 C 语言中的 a。signed char

答:

10赞 Serge Ballesta 2/4/2023 #1

答案是否定的,原因有二。

  1. Java 中原始类型的概念是通过与对象类型的对立而存在的。这在不是对象语言的 C 语言中是没有意义的。
  2. C 打算在任何架构上尽可能高效,从 16 位甚至 8 位微控制器到 64 位平台。因此,通常选择该类型作为体系结构的自然类型,前提是它至少包含 16 位。另一方面,Jave 的目标是最大的便携性并修复其所有类型的大小。int

因此,即使维基百科上的列表看起来很大,它(不幸的是......)也是准确的。

评论

0赞 GIZ 2/4/2023
不是 、 、 等 ...被认为是原始数据类型?charlongdouble
3赞 Andrew Henle 2/4/2023
@GIZ C 没有“基元”类型。这个词不适用于C.C只有“类型”。
0赞 John Bollinger 2/4/2023
如果维基百科上的列表看起来很长,部分原因是维基百科列出了许多类型的几种替代拼写。这并非完全不准确,但可能具有欺骗性。例如,与 不是不同的类型。shortsigned short int
0赞 2/5/2023
@andrew - 该标准已有 10 多年的历史,您是否有指向更新版本的链接?
0赞 Andrew Henle 2/5/2023
@bobbywang 目前没有更新的批准标准。C18 只是“解决了 C11 中的缺陷,而没有引入新的语言功能”。C23仍未获得批准,处于草案阶段
2赞 Steve Summit 2/4/2023 #2

我想说的是,C语言确实有“原始”或“基本”类型的概念,但正如我们所看到的(在问题、评论和链接的维基百科文章中),这些类型的列表相当长,并不像你想象的那么简洁,或者像K&R时代那样。

我自己对 C 语言中原始类型的定义可能是“任何可以构建派生类型的东西,如数组、指针、函数返回和结构包含”。

我很确定 C 标准中的语法有基本类型和派生类型的产品,但我手边没有副本可以检查。

当前的 C 类型列表看起来如此冗长和复杂,因为出于软件工程和可移植性的原因,它包含大量“别名”,每个“别名”最终都以依赖于实现的方式映射到其他类型。例如,通常与任一 或 相同,并且通常与任一 或 相同。int32_tintlong intsize_tunsigned intunsigned long int

如果你想建立一个简洁的列表,我认为你从:

  • void
  • bool
  • int相当多的尺寸(包括 和charwchar_t)
  • unsigned int相当多的尺寸
  • 多种尺寸的浮点

然后你有一组“符号”类型,如 和 和 ,它们通常以实现定义的方式映射到各种 or 类型。size_tptrdiff_tintptr_tintunsigned int

然后,你有一组精确大小的类型,如 和 ,它们都以实现定义的方式与其他整数类型映射在一起。int8_tint16_tuint32_t

在考虑角色类型时,您还必须小心。Plain 可以是有符号的,也可以是无符号的,因此您可以认为实际上有三种基本字符类型:、 和 (在任何给定平台上,要么 和 ,要么 和 ,要么相同)。还有一种类型具有自己的实现定义映射。charcharsigned charunsigned charcharsigned charcharunsigned charwchar_t

评论

2赞 Joshua 2/4/2023
在 C 中,我习惯于让原始类型表示两件事之一。它不是结构体也不是数组,或者它不是结构体,不是数组,也不是指针,具体取决于上下文。
0赞 user3386109 2/4/2023
完整的类型列表位于 C11 的第 6.7.2 节中。它甚至比维基百科列表还要长。然后是存储类说明符、类型限定符和对齐说明符。我们不要忘记位字段。
1赞 Andrew Henle 2/4/2023
这些类型的列表相当长其实不然: 1. , 2. , 3. , 4. , 5. 6. 7. , 8..[un[signed]] char[un[signed]] short [int][un[signed]] int[un[signed]] long [int][un[signed]] long long [int]floatdoublelong double
0赞 Elzaidir 2/4/2023
@AndrewHenle你忘记了 [float/[long] double] _Complex 和 _Bool
0赞 Andrew Henle 2/4/2023
@Elzaidir 6、7 和 8。 将实现为从我的列表的 1-5 中提取的值约束无符号整数类型,并且既是可选的,也是从我的列表的 6-8 中提取的两个浮点值的聚合。_Bool_Complex
4赞 John Bollinger 2/4/2023 #3

C 似乎有很多很多类型,但如果有任何被认为是原始类型的话呢?

Java 术语“基元类型”与引用类型不同。C 没有 Java 引用类型的直接类比,因此没有必要进行这样的区分。

然而,C 确实定义了几类类型,在这些类型中,基本类型是 Java 原始类型的一个相当好的类比。此类别包括 、有符号和无符号整数类型以及 floating[-point] 类型。最终,所有其他类型都是从这些、枚举类型和类型派生出来的,包括数组类型、结构和联合类型、指针类型、原子类型和函数类型。charvoid

基本类型可以包括实现定义的类型,因此无法详尽列出,但语言规范定义的类型包括:

char

标准有符号整数类型
、 、 、
signed charshort intintlong intlong long int

标准无符号整数类型
、 、 、 、
_Boolunsigned charunsigned short intunsigned intunsigned long intunsigned long long int

真正的浮动类型
, ,
floatdoublelong double

复数类型
、 、
float _Complexdouble _Complexlong double _Complex

这在语言规范的第 6.2.5 节中进行了介绍。

应该注意的是,虽然 Java 指定了其原始类型的大小和表示形式,但 C 将其基本类型的一些细节留给了实现,对它们的可表示值和其他属性范围施加了约束,而没有指定确切的细节。

C 似乎有很多很多类型

C 具有无限数量的类型,因为它提供了从其他类型派生的类型。这同样适用于 Java。忽略实现定义的扩展类型,C 的基本类型是 Java 原始类型的两倍多,但这仍然是可管理的,尤其是考虑到它们的组织方式。

但是,C 还具有定义类型别名的机制,以及一整套标准类型别名,这些可以使类型看起来比实际存在更多。

0赞 chris 2/12/2023 #4

不幸的是,没有一套有凝聚力的词汇可以扩展到多种语言。

Java 的基元类型将它们与对象类型或引用类型区分开来。

虽然 C 有很多类型,但最接近 Java 原始类型的是主要类型

这些语言做不同的事情,因此它们的类型有不同的分组,类型本身也不同。

对于嵌入式系统,C 语言中的 int 可能是 2 个字节,但在 Java 中它始终是 4 个字节。