当你运行这样的代码时,它会显示d - >的值。 4 如果您取消注释cout<<& a,它会显示正确的值 - > 1
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int a=1,b=2,c=3,d=4;
/*cout<<&a<<endl;
cout<<&b<<endl;
cout<<&c<<endl;
cout<<&d<<endl;*/
cout<<*(&b - 0x1);
}
有人可以帮我理解为什么cout会改变返回值吗?
答案 0 :(得分:3)
没有这个陈述
cout<<&a<<endl;
变量a
未在程序中使用。因此,允许编译器生成目标代码,使得a
的定义不会包含在程序中。
取消注释此语句时,对象代码中存在变量a
。
考虑到一般情况下程序行为未定义。
如果变量不是数组的一部分,则不能在变量前取消引用。
cout<<*(&b - 0x1);
此外,编译器将变量放入内存的顺序是未指定的。
答案 1 :(得分:0)
您正在调用未定义的行为。
除非它是任何数组的一部分并且你的算术将值保存在数组中(或者超过它的一个结尾),否则执行修改这样的指针是没有效的。
因此,您正在访问某些内存的任意区域,并且没有您可能会收到的内容的定义。
当您注释掉这些行时,优化程序可能会注意到您没有使用v$parameter
,a
或c
,因此会从代码中省略它们。当你离开它们时,你会得到你期望的结果,因为你已经正确地推断出你的编译器(尽管并非所有编译器)相对于d
(如果有的话)存储a
。< / p>
优化程序不是必需的,并且通常不会尝试推断您b
的访问恰好落在&b-0x01
上。它的未定义行为与您得到的结果无关。
答案 2 :(得分:0)
根据定义,除非使用内存,否则C ++将从最后一个开始分配彼此相邻的所有地址。根据我的经验,他们彼此相邻。我能看到的唯一原因是因为如果没有使用优化a,就不会分配。 它总是显示d的值,这是最奇怪的部分。