【发布时间】:2019-06-10 19:06:12
【问题描述】:
这是第一段代码,输出 44:
const int a[] = {3};
int* b = (int*)&a[0];
*b = 4;
cout << a[0] << *b;
这是第二个,输出 34:
const int a = 3;
int* b = (int*)&a;
*b = 4;
cout << a << *b;
我不知道为什么会有差异。你们能解释一下吗?
【问题讨论】:
-
未定义行为未定义。不要试图在其中找到逻辑。
-
您正在修改您声明为 const 的变量。因此,您的程序具有未定义的行为。绝对不是他们“应该以同样的方式工作”的情况。事实上,你离这个目标已经很远了。
-
*b = 4;正在尝试修改在两种情况下定义为const的对象(const int a和const int a[1])。这两个程序都可以毫无理由地为所欲为。编辑:通常编译器会阻止您尝试这样做,但(int*)明确告诉编译器要管好自己的事并忽略您的错误。 -
删除转换为
int*,您的编译器可能会友好地告诉您:invalid conversion from ‘const int*’ to ‘int*’在这两种情况下。 -
@SolcanMihai 你能找到的任何逻辑都取决于你使用的编译器的细节。不同的编译器很可能会对这些程序产生不同的结果。所有 C++ 标准都必须说行为是未定义的。