我正在查看 SO 中的一个问题,并查看了该问题。
我在 python 中尝试过为 a&b 获取相同的 id。但是当我在c上尝试相同的时候,
main()
{
int a=4,b;
b=2+2;
printf("%p\n",&a);
printf("%p",&b);
}
但这打印了不同的值。为什么有区别?
我正在查看 SO 中的一个问题,并查看了该问题。
我在 python 中尝试过为 a&b 获取相同的 id。但是当我在c上尝试相同的时候,
main()
{
int a=4,b;
b=2+2;
printf("%p\n",&a);
printf("%p",&b);
}
但这打印了不同的值。为什么有区别?
等效的 Python 代码之所以起作用,是因为在您链接的问题的几个答案中给出的原因 - Python(或至少是 CPython)碰巧缓存了一些小整数值 - 其中 4 是其中之一,因此每个 Python 整数对象等于 4将是同一个对象,因此具有相同的id
.
在 C 中,整数是可变的,所以编译器不能执行这种优化——如果你 increment a
,你不会期望b
改变id
a
b
在实现层面,int
对 C 的意义与对 Python 的意义不同——即使它们碰巧在程序中服务于相同的目的。
Python 缓存了一些小整数。来自 python 文档http://docs.python.org/2/c-api/int.html
当前的实现为 -5 到 256 之间的所有整数保留一个整数对象数组,当您在该范围内创建一个 int 时,您实际上只是取回了对现有对象的引用。所以应该可以改变 1 的值。我怀疑 Python 在这种情况下的行为是未定义的。:-)
在 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.a
将y.b
指向同一个地址。