int main() { const int a = 100; std::cout << a << std::endl; __asm{ mov eax,5 mov a,eax } std::cout << a << std::endl; int* b = (int*)&a; std::cout << *b << std::endl; getchar(); return 0; } |
|
10分 |
首先const编译器会做检查,不允许你在C/C++代码中做更改,汇编则没法检查。其次你对第二个100的疑问,因为编译器优化了代码,他直接就std::cout << 100 << std::endl;,没有再从内存取值,而你指针指向则重新从内存取值。
|
不懂同问,debug中看a和b的值都是5,地址都一样
|
|
4分 |
volatile const int a = 100 这样加上就不会有问题了
|
3分 |
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
|
3分 |
修改 const 对象导致未定义行为,不要写这样的程序。
|
想验证下到底const是哪里限定的不能更改
|
|
你说的很对! |
|
5分 |
const变量不允许被修改,如果你硬性使用汇编要修改也没办法,呵呵
|
10分 |
const只是编译器的const
不是内嵌汇编器的const 更不是CPU的const |
嗯。。。已经明白了 |
|
5分 |
由于a是const的,所以在编译的时候,需要使用a值的地方直接被编译器替换为100,也就是不查看内存
但a的确是可以修改的,如 __asm{ mov eax,5 mov a,eax } |