【问题标题】:What is the type of a builtin datatype in C and C++?C 和 C++ 中内置数据类型的类型是什么?
【发布时间】:2011-12-20 11:21:14
【问题描述】:

当我们写int a;时,并不意味着我们正在创建一个int类的对象。

  1. 这是什么意思?
  2. C 和 C++ 中数据类型 int 的类型是什么?
  3. 哪个头文件显示它是什么?

【问题讨论】:

  • 但是int a; 确实在 C++ 中创建了一个对象。它是int 类型的对象,如果它具有自动存储持续时间,则具有不确定的值;或值为0,如果它具有静态存储持续时间。
  • @AnishaKaul:该评论是错误的(如第 7 条评论所述)。在 C++ 中,“对象”是任何存储区域。
  • @BasileStarynkevitch 普通的旧数据是对象,就像类类型是对象一样。定义int a; 创建了一个int 类型的对象。
  • @AnishaKaul,参考标准 3.9-8,对象类型基本上是任何类型,不包括引用和函数。原语称为“算术类型”,但它是对象类型的子集。
  • @Cody:C 和 C++ 之间存在很大差异,但碰巧这个特定问题的答案在两者中是相同的(不同的标准引用,但结果相同)。真的有必要问两个问题吗?

标签: c++ c types built-in-types


【解决方案1】:

当我们写int a;时,并不意味着我们正在创建一个int类的对象。

int a; 确实在 C++ 中创建了一个对象。它是int 类型的对象,如果它具有自动存储持续时间,则具有不确定的值;或值为0,如果它具有静态存储持续时间。但是没有“类int”,因为int不是类类型。

int 是:

  • 整体式;
  • 签名类型;
  • 算术类型;
  • 基本类型;
  • 标量类型;
  • 标准布局类型;
  • 简单可复制的类型;
  • POD 类型;
  • 平凡的类型;

好像你对上一个问题有点困惑:)

int x = 12; 中,您正在创建一个类型为int 的对象,该对象名为x,值为12。

object 在 C++ 中的概念与大多数其他语言中的不同,当然也与 面向对象编程 圈子中常用的不同. C++ 中的对象是一个存储区域。

如果某物具有类型,则它可以是对象、引用或函数。

哪个头文件显示它是什么?

该语言只要求 int 类型必须存在并具有某些特征(例如是整数和有符号)。我所知道的所有编译器都只是专门处理所有内置类型,这就是为什么您不会在标准库头文件中找到它们的定义。事实上,它们无法在任何使用 C++ 的标头中为它们提供定义,因为该语言不提供任何定义基本类型的方法。他们只能:

  • 将其定义为复合类型(这是错误的);或
  • 使用特定于编译器的扩展来定义它。

内置类型实际上很神奇。

【讨论】:

  • @thecoshman:对象的概念在 C++ 标准中正式定义。
  • 也是标准布局类型可复制类型POD类型普通类型 :)
  • @Anisha: int 是类型
  • @Anisha:这是一个内置类型。编译器在没有任何定义的情况下对其进行特殊处理。但它不能是一个类。
  • 在最新的 C++ 标准中,这在第 3.9.1 节和第 3.9.2 节中有描述。这些区分了基本类型和复合类型(类、数组等)。 int 是基本类型,因此不能是类。
【解决方案2】:

int 类型内置在语言和编译器中。在大多数实现中,它是某种机器word(适合处理器的寄存器),由处理器有效处理。在我的 (Debian/Linux/AMD64) 系统上,它是一个 32 位的字,通常对齐到 4 个字节。

没有定义它的标题。编译器对int有深入了解。而且它不是一个类或某种聚合类型,它是原子的,因为它不是由更小的东西组成的。

我知道的所有语言都有预定义或内置类型(或名称),编译器特别了解这些类型。例如,在 Ocaml 中,Pervasives 模块是内置的。

【讨论】:

  • 我添加了一个链接来解释机器词
  • "...在大多数实现中,它是某种机器字" - 对于所有 64 位 Linux 来说根本不是这样,其中 long 是机器字。
  • x86-64 上word 的定义取决于上下文。但我确实添加了“适合寄存器”和一个 32 位 int 适合 32 位 [sub-] 寄存器,如 AMD64 上的 EAX(不是 RAX)
【解决方案3】:

(就 C 而言)

int 是一个原始类型,扩展它是一个语言关键字。没有任何类型的标题声明它。

但是,在标头中定义了许多 typedefs,它们确实使用原始类型作为“后端”,并且确实要求您包含相关标头(即 uint32_tuint16_t 等)。

【讨论】:

    【解决方案4】:

    当您键入“int a;”时,您会让编译器知道 a 范围内的任何符号“a”都具有数据类型“int”。

    【讨论】:

      【解决方案5】:

      int 是一个内置类型,没有头文件定义它。 int a; 的含义取决于这行代码所在的位置。

      可以

      • 局部变量
      • 对象字段
      • 全局变量

      注意int a; 不是定义局部变量的好方法。你应该总是初始化它,有几种方法可以这样做:

      
      int a = 5; //value is 5
      int a = int(); //default constructor, value is 0
      

      【讨论】:

      • 'int a();'可悲的是,它没有默认构造和 int。你想要 'int a=int();'查找“最令人头疼的解析”
      猜你喜欢
      • 2022-07-01
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 2010-10-24
      • 2011-07-05
      • 2013-05-27
      相关资源
      最近更新 更多