【问题标题】:What exactly is a variable in C++?C++ 中的变量到底是什么?
【发布时间】:2010-05-27 11:48:09
【问题描述】:

标准说

变量由对象的声明引入。变量名表示对象。

但这个定义究竟意味着什么?

变量是否为对象命名,即变量是否只是匿名对象的命名机制?还是变量本身就是名称?

或者在每个变量也是一个对象的意义上,一个变量是一个命名对象?

或者变量只是一个“代理”,其名称将所有操作“委托”给真实对象?

为了进一步混淆,许多 C++ 书籍似乎将变量和对象视为同义词。

您对此有何看法?


关于实体,引用自 C++0x 草案:

实体是值、对象、引用、函数 [...]

每个表示实体的名称都由声明引入。

通过对象的声明引入变量

从这些陈述中,我得出结论,变量是名称,因此不能是对象。这真的让我很困惑:)

【问题讨论】:

  • 我的蹩脚尝试:一个变量是一个可以赋值的左值,如果它没有标记const
  • 变量本质上只是一个标签,它提供对特定内存位置内容的访问——与将特定内存位置的地址保存为它的指针相比价值。

标签: c++ variables object


【解决方案1】:

变量是命名的对象。以下创建不是变量的对象

new int // create one int object
std::string() // create one string object

以下创建一个名为“foo”的数组变量和 5 个“int”类型的未命名(子)对象

int foo[5];

以下不是C++03中的变量,而是C++0x中的has become a variable(声明的引用是C++0x中的变量,详情见链接)

extern int &r;

变量是否为对象命名,即变量是否只是匿名对象的命名机制?

变量是对象(或引用)。 C++ 的实体列表(C++03 中的3/3)包含多个这样的is-a 关系。例如,子对象是对象,数组元素是对象,类成员是对象或函数或类型或模板或枚举器。

C++0x 的实体列表对我来说看起来更干净一些,它不包含“变量”、“函数实例”(这种实体对我来说甚至是什么都不明显), “子对象”和“数组元素”了。相反,它添加了“模板专业化”,它们可以是函数、类或模板(部分专业化)。

1.8 的 C++ 对象模型说

一个对象可以有一个名称(第 3 条)。

因此,如果您愿意,可以将语句表述为“对象的名称表示对象。”。

【讨论】:

  • 只有 declared 引用是 C++0x 中的变量;) 例如,static_cast<Student&>(person) 不是变量,而是“匿名引用”,因为没有更好的术语.
  • 一个不是变量的对象的更说明性示例是作为参数传递给其他对象的匿名对象。
  • @FredOverflow 好点,我会在阅读一些 FCD 后将其合并到答案中:)
  • 感谢提及实体列表,我已经更新了我的问题。请阅读更新并回复;)
  • @FredOverflow 我没有得出同样的结论。文本说,表示对象的名称是由声明引入的。它说对象的声明引入了一个变量。我不能由此得出一个变量就是一个名字的结论。
【解决方案2】:

变量是你给对象起的名字,所以是的,对象总的来说是匿名的。

【讨论】:

  • 由于投反对票,我发现很难推断出您的答案的哪一部分不准确。是不是因为答案只是一句技术含量不高的句子?还是因为大多数对象不是匿名的?
【解决方案3】:

这是来自 C++17 标准的定义:

一个变量是由引用other的声明引入的 比非静态数据成员或对象。变量的名称,如果 any,表示引用或对象。

坦率地说,我对此的看法是,这并不是一个真正的定义。它告诉我们什么引入一个变量,但它没有定义一个变量是什么

考虑,例如:

int foo = 42;

这是一个对象的声明,所以它“引入”了一个变量。但是变量是什么?名为foo 的对象是变量吗?我本来是这么想的,但定义实际上并没有这么说。显然,“变量”有一个名称(在本例中为“foo”),该名称表示对象。既然它一个名字,想必名字本身不是变量。并且很容易说变量对象,而不是变量的名称表示对象,如果这是意图的话。

什么是 C++ 中的“变量”?我真的不知道,我不相信根据标准中的措辞来回答这个问题是可能的。 (我希望在以后的版本中对此进行更正。)

(C 标准通过不定义“变量”来解决这个问题,并且在大多数情况下,除了作为形容词或非正式地使用它。)

【讨论】:

  • "什么是 C++ 中的“变量”?" 这是一个表示引用或对象的东西。那东西可能有名字。变量不是对象/引用;它denotes 一个对象/引用。我不知道还需要说什么。该标准也没有从概念上定义“实体”是什么。它只是说事物 X、Y 和 Z 是实体。
  • @NicolBolas 这仍然只说明了它的作用,而不是它的本质。这是一个“东西”。什么样的事情?如果我在一张纸上写“foo”,它表示那个对象。论文是变量吗? “变量”如何成为一个有用的概念?
  • 我的观点是,该标准通常不会回答这样的问题。该标准没有解释某事的含义,它只是描述了它是什么。当声明引入对象或引用时,该过程会引入一个变量,其名称(如果有)表示对象或引用。
  • @NicolBolas:我的观点是定义应该是定义。读完之后,我仍然不知道什么是“变量”。我确实知道什么是“对象”以及什么是“标识符”,因为这些术语的定义告诉我什么是对象或标识符,什么不是对象或标识符。
  • "我知道什么是“对象”" OK:什么是对象?因为 C++ 的标准定义同样含糊不清:“对象是由定义 (6.1)、new 表达式 (8.3.4)、隐式更改联合的活动成员 (12.3) 或当临时对象被创建 (7.4, 15.2)。对象在其构建期间 (15.7)、整个生命周期 (6.8) 和销毁期间 (15.7) 占用存储区域。”这说明了它是如何形成的以及它生活在哪里,但不是它是什么
【解决方案4】:

变量只是具有类型和名称的实体

【讨论】:

    【解决方案5】:

    据我所知

    什么是变量

    变量是绑定到存储在系统内存中的值的标识符(命令式语言)或可以计算的表达式(函数式语言)。

    为什么我们需要变量

    • 为存储块提供名称,以便在计算机程序的生命周期内临时存储数据。
    • 也用于编程中将信息从程序的一个部分传输到另一部分(例如:参数、全局变量)。

    【讨论】:

      【解决方案6】:

      变量实际上是内存中对象的名称,因此在编译之前,对象在这方面是匿名类型,当编译发生时,变量在句法和解析阶段被跟踪,然后当链接器启动时,该变量将分配一个内存地址,尽管在运行时,该内存地址将在某处正确偏移以考虑动态链接或静态链接。因此,变量可以很容易地被引用,也就是变量分配到的内存地址。

      真的,简而言之,变量是为了帮助程序员计算出执行的连接点,在这些连接点处,该变量在机器代码中被引用。

      【讨论】:

        【解决方案7】:

        您对此有何看法?

        变量是堆栈或代码段中的一块内存,或寄存器中的值(如果变量的大小足够小,尽管通常它仍然是内存中的值而寄存器保存临时结果),具有名称为程序员提供方便。编译后变量名不存在(这里不讨论宏技巧)。对变量的任何访问都被解析为内存访问,因此从技术上讲,变量是相应数据块的地址,并且该地址不存储在任何地方。想想汇编语言中的变量声明——变量“有点”存在,但它仍然只是数据块的偏移量。

        【讨论】:

        • 对象存在于堆、栈或数据段中。
        • 你理解我,所以没有理由吹毛求疵。
        • 真正唯一的好答案。变量实际上只是指向编译器为您计算的内存地址的指针,因为使用名称而不是数字更为惯用。
        【解决方案8】:

        我觉得这个定义很明确。

        变量由声明引入,表示对象。谁引入了变量?你当然会这样做,因此是你使用它。

        变量实际上只是为您开发人员提供便利。它是大多数编程语言的基本方面,而不仅仅是 C++。变量可能会为占用存储空间的可用实体提供一个符号名称,以便将来可以在源代码中引用和使用它。

        例如,如果您在方法中声明一个变量:

        int x = 5;
        

        编译器会将其减少到与堆栈指针的某个偏移量,例如 SP + 0x003。

        稍后你可以说:

        x = 52;
        

        在这种情况下,堆栈内存 SP + 0x003 的区域将包含描述数字 52 的字节。

        您将变量声明为某种类型,以便编译器可以计算出数据在内存中占用的空间。 如果没有变量,您将不得不自己管理所有信息的排列,并且您可能会在汇编或更低版本中进行编码。

        【讨论】:

        • 我发现您的定义“变量由声明引入并表示对象”非常清楚,但不幸的是,这不是标准所说的:) 根据标准,声明 objects,表示对象的不是变量,而是变量的name :(
        • 嘿,也许我什至应该成为一名标准编写者:-)。顺便说一句,我认为通过阅读它的标准文档来学习一门语言是一种自我伤害......
        【解决方案9】:

        变量是对象的名称。您可以通过此命名实体访问该对象。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-16
          • 2015-10-20
          • 1970-01-01
          • 1970-01-01
          • 2014-11-06
          • 1970-01-01
          相关资源
          最近更新 更多