【问题标题】:If we assign a new value to a variable, what happens to the old value ? (in C)如果我们为变量分配一个新值,旧值会发生什么? (在 C 中)
【发布时间】:2021-12-31 08:14:32
【问题描述】:

摘自 Stephen G Kochan 所著的“C 语言编程(第 4 版)”一书

// Basic conversions in C

#include <stdio.h>

int main (void)
{
    float  f1 = 123.125, f2;
    int    i1, i2 = -150;
    char   c = 'a';

    i1 = f1;                 // floating to integer conversion
    printf("%f assigned to an int produces %i\n", f1, i1);

    f1 = i2;                 // integer to floating conversion
    printf("%i assigned to a float produces %f\n", i2, f1);

    f1 = i2 / 100;           // integer divided by integer
    printf("%i divided by 100 produces %f\n", i2, f1);

    f2 = i2 / 100.0;           // integer divided by a float
    printf("%i divided by 100.0 produces %f\n", i2, f2);

    f2 = (float) i2 / 100;     // type cast operator
    printf("(float) %i divided by 100 produces %f\n", i2, f2);
    return 0;
}

我是编程新手,我试图从上面提到的书中学习如何用 C 编程。我遇到了这个sn-p代码,用于将整数转换为浮点数,反之亦然。我对实际发生的事情有点困惑。

这是我目前所理解的: 前几行(float f1 = 123.135, f2; 和接下来的两行)声明了变量。

然后i1 = f1; 行将123.125 的值分配给名为i1 的变量,但由于i1 是一个整数,它被截断为123

现在,这是我的问题,在下一行 f1 = i2; 中,值 -150 被分配给名为 f1 的变量,但由于它是 float,因此该值存储为浮点数,即 -150.000000但是123.125 发生了什么?

该值是否仍然存在于计算机内存中的某处?如果是这样,我该如何访问它?就像以前将该值分配给f1 时一样,我可以将其称为f1,但现在它不再分配给任何变量,我可以以某种方式引用它吗?

就像一个更通用的版本一样,如果我们为变量分配一个新值,旧值会发生什么?

我在In python when we assign a new value to a variable what happens to the old one? 看了一眼 但是在 C 中也会发生同样的情况吗?

【问题讨论】:

  • 分配给变量的内存被新值覆盖。什么不清楚?
  • 将 C 变量视为临时赋予内存地址的名称*。当您分配给一个变量时,您会覆盖该地址的内容,旧值就消失了。 (*从技术上讲,情况可能并非总是如此。)
  • 一个变量只能保存一个值,所以如果你给一个变量分配一个新值,旧值就没有了。
  • 对于链接的 Python 问题:不,这与 C 无关。这是关于更复杂的代码和系统类型。 C 没有那里描述的功能。
  • 在物理上,内存芯片在某些位置保存一些电子(1 位)或不保存它们(0 位)。当您存储新值时,电子会重新排列以保存新位。

标签: c variables reference


【解决方案1】:

在 C 中,变量是一个名称,用于使一块内存更易于使用。当你给变量赋值时,这个值会被存储到与变量名对应的一块内存中。

这意味着在将新值存储到变量中时,旧值将被覆盖,因为变量仍然引用同一块内存。通常,第一个值不会以任何以后可以访问的方式保留。

现在有一些“异国情调”的做事方式可能无法使这句话 100% 正确。写入时复制系统(其中一些在 C 中实现)在写入新值时会保留旧值(在一般意义上)。但是,大多数 C 程序中甚至都不存在这类系统,如果您使用过这种系统,您就会知道。

【讨论】:

  • 但是,大多数 C 程序中甚至都不存在这类系统,如果你使用过,你就会知道...实际上大多数人在不知道的情况下使用这样的系统:) 许多当前的台式机和智能手机使用依赖于这种机制的虚拟内存来加速程序启动,eps。 fork 系统调用。但这发生在操作系统级别,超出了正在运行的 C 程序的范围。
【解决方案2】:

该值是否仍然存在于计算机内存中的某个位置?

一般的答案是:不,一旦你为一个变量分配了一个新值,旧值就消失了,因此你无法访问它。

也就是说……

根据您的编译器,初始化程序(如您的 123.125)可能是程序内存的一部分,因此该值可能仍位于内存中的某个位置。但是,这并不重要,因为您不知道在哪里,因此无法访问它。所以对于任何实际用途,它已经消失了......

【讨论】:

    【解决方案3】:

    每当您创建一个变量并为其分配一个值时,它都会存储在内存中,但是当我们更改变量的值时,我们基本上是用新值替换它。所以旧值会从内存中删除

    【讨论】:

      【解决方案4】:

      变量就像一个值的占位符。如果您为变量分配新值,则意味着您用新值覆盖旧值,旧值将永远消失。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-13
        • 1970-01-01
        • 2017-05-07
        • 2014-12-21
        相关资源
        最近更新 更多