1

我正在查看 SO 中的一个问题,并查看了该问题。

为什么 id 函数的行为与整数和浮点数不同?

我在 python 中尝试过为 a&b 获取相同的 id。但是当我在c上尝试相同的时候,

main()
{
    int a=4,b;
    b=2+2;
    printf("%p\n",&a);
    printf("%p",&b);
}

但这打印了不同的值。为什么有区别?

4

3 回答 3

5

等效的 Python 代码之所以起作用,是因为在您链接的问题的几个答案中给出的原因 - Python(或至少是 CPython)碰巧缓存了一些小整数值 - 其中 4 是其中之一,因此每个 Python 整数对象等于 4将是同一个对象,因此具有相同的id.

在 C 中,整数是可变的,所以编译器不能执行这种优化——如果你 increment a,你不会期望b改变idab

在实现层面,int对 C 的意义与对 Python 的意义不同——即使它们碰巧在程序中服务于相同的目的。

于 2013-04-14T08:31:10.667 回答
2

Python 缓存了一些小整数。来自 python 文档http://docs.python.org/2/c-api/int.html

当前的实现为 -5 到 256 之间的所有整数保留一个整数对象数组,当您在该范围内创建一个 int 时,您实际上只是取回了对现有对象的引用。所以应该可以改变 1 的值。我怀疑 Python 在这种情况下的行为是未定义的。:-)

于 2013-04-14T08:34:36.930 回答
1

在 C 中,两个变量总是有不同的地址,

唯一的例外是当你使用联合时,

考虑下面给出的代码,

union x
{
 int a;
 int b;

}y;

main()
{
    y.a=4;
    y.b=2+2;
    printf("%p\n",&y.a);
    printf("%p",&y.b);
}

这里两者都y.ay.b指向同一个地址。

于 2013-04-14T08:35:23.913 回答