#include <iostream>
using namespace std;
int main() {
const int N = 22;
int * pN = const_cast<int*>(&N);
*pN = 33;
cout << N << '\t' << &N << endl;
cout << *pN << '\t' << pN << endl;
}
Run Code Online (Sandbox Code Playgroud)
22 0x22ff74
33 0x22ff74
为什么同一地址有两个不同的值?
Eri*_*ert 22
为什么同一地址有两个不同的数据?
没有.允许编译器优化对const的任何提及,就好像你已经在其中编写了编译时值.
请注意,编译器也允许生成在运行它时擦除硬盘的代码,如果你做了一些令人讨厌的技巧,比如写入为consts保留的内存.
GMa*_*ckG 10
你在行上得到了未定义的行为*pN = 33;,因为你正在修改一个const值.任何事情都可能发生.不要这样做.
但可能,您的编译器只是进行了优化.在线:
cout << N << '\t' << &N << endl;
Run Code Online (Sandbox Code Playgroud)
它知道N是一个值为22的常量表达式,所以只需将该行更改为:
cout << 22 << '\t' << &N << endl;
Run Code Online (Sandbox Code Playgroud)
在下一行中,您将获取地址的值,并将N其"设置"为33.(但实际上,您所做的只是删除有关程序状态的任何保证.)
通过声明它N是const,您已承诺不会对其进行修改。然后您去修改它。这打破了编译器所做的假设之一,结果,程序的行为不正确。
这被称为“未定义行为”-违反该语言的假设后,程序的行为将完全未定义。它不需要产生该输出-它既可以33为或产生,也可以为42崩溃,擦除硬盘驱动器或通过鼻道传唤的恶魔产生。因此,请勿修改const值:)
| 归档时间: |
|
| 查看次数: |
1740 次 |
| 最近记录: |