对 const 的思考
来源:互联网 发布:怎么用mac玩美服lol 编辑:程序博客网 时间:2024/05/28 05:16
用const 修饰的数值,一般是不可修改的,但在C语言中,可以通过变量的地址来修改其内容。
#include <stdio.h>int main(int argc, char *argv[]){const int i = 10;int *p = &i;// 取i 的地址*p = 100;// 修改地址里面的内容//i = 0;// 报错!printf("*p = %d, i = %d\n", *p, i);return 0;}
结果:
const 修饰的数值已经被修改了。
但是如果在C++中这么做,那么编译器会报错,说明C++的编译检查更加严格,那么按照通过变量地址来修改其变量的想法,进行修改。
#include <iostream>using namespace std;int main(int argc, char *argv[]){const int i = 10;int addr = (int)&i;int *p = (int*)addr;*p = 100; // 通过地址修改i 的值cout<<"*p = "<<*p<<", i = "<<i<<endl;return 0;}
结果
i 的数值没有发生变化?!
调试:
在调试结果中,i 的数值已经是100了,打印的结果却还是原来的数值,通过反汇编代码可以看到,push 0AH。
也就是在打印的时候,并没有从i 的地址中重新去取数值,而是直接将i原始的结果push进去,所以结果没有变化。
是不是所有const修饰的数值,其使用和赋值都是通过原始的数值,而不是再从地址去数值?
简单测试代码:
#include <iostream>using namespace std;int main(int argc, char *argv[]){const int i = 10;const int j = 100;int k = 0;k = i;k = j;cout<<i<<", "<<j<<endl;return 0;}
结果:
果然在C++中,从反汇编结果中知道,用const修饰的数值,在使用的时候,不会再从与原先的地址中取数值了,应该是用const修改的数值,被存放在寄存器中了,直接从寄存器中取值,而不会再从地址取值。
同样一段代码,如果用C语言编译,则会从原先的地址中取值。
总结:在反汇编代码中,加上 const 与没有加上 const 的反汇编代码是一样的,说明const 对实际代码并没有产生特别的影响,那么可知,const 只影响到编译器,也就是编译器会对const指向的数值进行检查,所以严格来说,const 修饰的不是一个常量,而是编译器的一种编译检查,应该说是变量的不可修改性。
对于const修饰的变量,在使用时:
在C语言中,会从原先的变量地址中,获取数值。(即可以通过变量的地址来修改const修饰的变量)
在C++语言中,不会从原先的变量地址中获取数值。(即即使通过变量的地址成功修改变量了,其变量在使用时,因为不会从地址中获取数值,所以还是原先的数值,说明C++的编译机制,更加保证了const修饰的变量的不可修改性)
- 对 const 的思考
- const的思考
- const的思考
- const的思考
- const的思考
- const的思考
- 关于const的思考
- const的思考
- const的思考
- const的思考
- 转: const的思考
- const的思考
- const的思考
- const的思考
- const的思考
- const的思考
- const的思考
- const的思考
- fhgdhfgjfgjghjghhj
- sgdhfghfgjghjghjghj
- POCO中的内存管理
- scala简要:操作符和解析器
- 【5】红烧鸡块
- 对 const 的思考
- memcache之旅(一)
- 2015年1月1日与卿之约定
- PAT 03-1. 二分法求多项式单根(20)
- Eclipse assert语句
- Android作为客户端,PC作为服务端:实现网络通信
- java学习day03
- 20150102
- 如何去掉DedeCMS评论中的手形和表情图片